使用 IdentityServer 保护 Vue 前端_全球观速讯
《使用 IdentityServer 保护 Web 应用(AntD Pro 前端 + SpringBoot 后端)》中记录了使用 IdentityServer 保护前后端的过程,其中的前端工程是以 UMI Js 为例。今天,再来记录一下使用 IdentityServer 保护 Vue 前端的过程,和 UMI Js 项目使用 umi plugin 的方式不同,本文没有使用 Vue 相关的插件,而是直接使用了 oidc-client js。
另外,我对 Vue 这个框架非常不熟,在 vue-router 这里稍微卡住了一段时间,后来瞎试居然又成功了。针对这个问题,我还去 StackOverflow 上问了,但并没有收到有效的回复:https://stackoverflow.com/questions/74769607/how-to-access-vues-methods-from-navigation-guard
(相关资料图)
首先,需要在 IdentityServer 服务器端注册该 Vue 前端应用,仍然以代码写死这个客户端为例:
new Client{ClientId = "vue-client",ClientSecrets = { new Secret("vue-client".Sha256()) },ClientName = "vue client",AllowedGrantTypes = GrantTypes.Implicit,AllowAccessTokensViaBrowser = true,RequireClientSecret = false,RequirePkce = true,RedirectUris ={"http://localhost:8080/callback","http://localhost:8080/static/silent-renew.html",},AllowedCorsOrigins = { "http://localhost:8080" },AllowedScopes = { "openid", "profile", "email" },AllowOfflineAccess = true,AccessTokenLifetime = 90,AbsoluteRefreshTokenLifetime = 0,RefreshTokenUsage = TokenUsage.OneTimeOnly,RefreshTokenExpiration = TokenExpiration.Sliding,UpdateAccessTokenClaimsOnRefresh = true,RequireConsent = false,};在 Vue 工程里安装 oidc-client
yarn add oidc-client在 Vue 里配置 IdentityServer 服务器信息
在项目里添加一个 src/security/security.js文件:
import Oidc from "oidc-client"function getIdPUrl() {return "https://id6.azurewebsites.net";}Oidc.Log.logger = console;Oidc.Log.level = Oidc.Log.DEBUG;const mgr = new Oidc.UserManager({authority: getIdPUrl(),client_id: "vue-client",redirect_uri: window.location.origin + "/callback",response_type: "id_token token",scope: "openid profile email",post_logout_redirect_uri: window.location.origin + "/logout",userStore: new Oidc.WebStorageStateStore({store: window.localStorage}),automaticSilentRenew: true,silent_redirect_uri: window.location.origin + "/silent-renew.html",accessTokenExpiringNotificationTime: 10,})export default mgr在 main.js 里注入登录相关的数据和方法数据
不借助任何状态管理包,直接将相关的数据添加到 Vue 的 app 对象上:
import mgr from "@/security/security";const globalData = {isAuthenticated: false,user: "",mgr: mgr}方法
const globalMethods = {async authenticate(returnPath) {console.log("authenticate")const user = await this.$root.getUser();if (user) {this.isAuthenticated = true;this.user = user} else {await this.$root.signIn(returnPath)}},async getUser() {try {return await this.mgr.getUser();} catch (err) {console.error(err);}},signIn(returnPath) {returnPath ? this.mgr.signinRedirect({state: returnPath}) : this.mgr.signinRedirect();}}修改 Vue 的实例化代码
new Vue({router,data: globalData,methods: globalMethods,render: h => h(App),}).$mount("#app")修改 router
在 src/router/index.js中,给需要登录的路由添加 meta 字段:
Vue.use(VueRouter)const router = new VueRouter({{path: "/private",name: "private page",component: resolve => require(["@/pages/private.vue"], resolve),meta: {requiresAuth: true}}});export default router
接着,正如在配置中体现出来的,需要一个回调页面来接收登录后的授权信息,这可以通过添加一个 src/views/CallbackPage.vue文件来实现:
<script>export default {async created() {try {const result = await this.$root.mgr.signinRedirectCallback();const returnUrl = result.state ?? "/";await this.$router.push({path: returnUrl})}catch(e){await this.$router.push({name: "Unauthorized"})}}}</script>Sign-in in progress... 正在登录中……
然后,需要在路由里配置好这个回调页面:
import CallbackPage from "@/views/CallbackPage.vue";Vue.use(VueRouter)const router = new VueRouter({routes: {path: "/private",name: "private page",component: resolve => require(["@/pages/private.vue"], resolve),meta: {requiresAuth: true}},{path: "/callback",name: "callback",component: CallbackPage}});export default router
同时,在这个 router 里添加一个所谓的“全局前置守卫”(https://router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%85%A8%E5%B1%80%E5%89%8D%E7%BD%AE%E5%AE%88%E5%8D%AB),注意就是这里,我碰到了问题,并且在 StackOverflow 上提了这个问题。在需要调用前面定义的认证方法时,不能使用 router.app.authenticate,而要使用 router.apps[1].authenticate,这是我通过 inspect router发现的:
...router.beforeEach(async function (to, from, next) {let app = router.app.$data || {isAuthenticated: false}if(app.isAuthenticated) {next()} else if (to.matched.some(record => record.meta.requiresAuth)) {router.apps[1].authenticate(to.path).then(()=>{next()})}else {next()}})export default router
到了这一步,应用就可以跑起来了,在访问 /private 时,浏览器会跳转到 IdentityServer 服务器的登录页面,在登录完成后再跳转回来。
添加 silent-renew.html注意 security.js,我们启用了 automaticSilentRenew,并且配置了 silent_redirect_uri的路径为 silent-renew.html。它是一个独立的引用了 oidc-client js 的 html 文件,不依赖 Vue,这样方便移植到任何前端项目。
oidc-client.min.js首先,将我们安装好的 oidc-client 包下的 node_modules/oidc-client/dist/oidc-client.min.js文件,复制粘贴到 public/static目录下。
然后,在这个目录下添加 public/static/silent-renew.html文件。
给 API 请求添加认证头Silent Renew Token <script src="oidc-client.min.js"></script><script>console.log("renewing tokens");new Oidc.UserManager({userStore: new Oidc.WebStorageStateStore({ store: window.localStorage })}).signinSilentCallback();</script>
最后,给 API 请求添加上认证头。前提是,后端接口也使用同样的 IdentityServer 来保护(如果是 SpringBoot 项目,可以参考《[使用 IdentityServer 保护 Web 应用(AntD Pro 前端 + SpringBoot 后端) - Jeff Tian的文章 - 知乎](https://zhuanlan.zhihu.com/p/533197284) 》);否则,如果 API 是公开的,就不需要这一步了。
对于使用 axios 的 API 客户端,可以利用其 request interceptors,来统一添加这个认证头,比如:
import router from "../router"import Vue from "vue";const v = new Vue({router})const service = axios.create({// 公共接口--这里注意后面会讲baseURL: process.env.BASE_API,// 超时时间 单位是ms,这里设置了3s的超时时间timeout: 20 * 1000});service.interceptors.request.use(config => {const user = v.$root.user;if(user) {const authToken = user.access_token;if(authToken){config.headers.Authorization = `Bearer ${authToken}`;}}return config;}, Promise.reject)export default service
标签:
推荐文章
- 2023温网大幕开启,OPPO专业影像实力见证赛场精彩时刻_焦点滚动
- 江苏三条过江通道建设有新进展 崇启公铁长江大桥北主塔桩基全部完成 环球新视野
- 滁州学院与琅琊区合作交流会暨校政企研签约仪式举行
- 美味扇贝处理技巧大揭秘!|全球速递
- 没有离职证明可以提取公积金吗
- 老年子宫内膜息肉怎么治疗(子宫内膜息肉怎么治疗) 当前视点
- 环球热资讯!大学录取通知书里,藏着这些中国式浪漫
- 中年打鼾怎么治疗_打鼾怎么治疗_天天热闻
- 滚动:上海大学2023级研究生新生缴费办法
- 世界短讯!关于征求省标《福建省居住建筑节能设计标准》(征求意见稿)意见的通知
- b2c网站有哪些营销策略(b2c网站有哪些) 全球头条
- 世界热文:世界周刊丨美国“毒”病难有尽头
- 快资讯:现代讽刺的韩国诗
- 观点:耳麦没有声音但是可以说话(耳麦没声音怎么办)
- 华纺股份(600448):7月3日技术指标出现看涨信号-“红三兵” 全球热文
- 每日动态!机构观点:美豆油涨停 国内棕榈油预计大幅拉升
- “小而美”的家庭托育点如何不负所“托”? 环球今日讯
- 索尼紧凑型数码相机市场份额急速下降 已从第一跌至第七
- win7需要administer的权限才能删除(win7需要administrator权限才能删除) 环球热消息
- 全球头条:浑南区教育局为少年举办成长礼
- 世界观点:银行股上半年涨跌参半,分红方案近期纷纷出炉
- 苹果怎么查询序列号入口_苹果怎么查询序列号_全球时讯
- iqooneo8pro怎么样值得买吗(iqoo neo 5和iqoo 7哪个下巴窄点) 世界讯息
- 枣庄封闭式初中学校有哪些 枣庄封闭式初中学校都有哪些_环球新消息
- 焦点播报:柯基被砍伤事件 砍死柯基男子被警方带走调查 基本情况讲解
- 内蒙古:算力产业绿色降碳 “绿电”使用率达58%左右|全球播报
- 郑州植得口腔医院收费贵不贵?口碑、坐诊大夫在线咨询!-天天快播报
- 传承红色基因 赓续红色血脉!常宁各界开展“七一”庆祝活动
- 朝鲜小“网红”介绍平壤,韩政府以“宣传朝鲜体制”为由屏蔽,谷歌跟风封号
- 冀凯股份:上半年预计亏损1600万元–2100万元
- 擤鼻子出血怎么治_擤鼻子出血怎么回事 今日热讯
- 法国连续第5夜发生骚乱:719人被捕 骚乱者驾车撞入官员家中
- 草原天路文化旅游提档升级
- 今年以来我国高温日数创历史新高,北方高温多次叠加实属罕见|全球即时看
- 大运会火炬“蓉火”今天开始在成都市内传递
- 佛系、躺平与内卷
- 热点评!民调数据中的美国:岌岌可危
- 环球热文:从“00”后到“80”后,“全职儿女”们的背后:只是暂停不是“躺平”
- 天天关注:四会富仕:公司产品应用于工业控制领域占比约60% 主要应用于马达、传感器等
- 2023年暑运正式开启 预计发送旅客7115万人次 环球快资讯
- 今日热讯:2022 年一级造价工程师《建设工程技术与计量(土木建筑工程)》考前模拟卷一单项选择题44
- 【快看】辽宁省抗美援朝精神研究基地在辽东学院揭牌
- 青山什么裹尸还(青山处处何须马革裹尸的意思)
- 当前热议!科创板IPO半年报:募资877亿领先全A 其中48%为半导体
- 交易型诈骗犯罪中“被害人财产损失”应予分类判断-焦点报道
- 等闲识得东风面万紫千红总是春是什么意思 这句诗译文介绍 世界动态
- 无锡滨湖重磅推出优化营商环境5.0版政策
- 下水管被水泥堵住了怎么疏通_下水管被水泥堵住了怎么办
- 人人皆可斗气化翼,白小纯危险等级攀升,外出历练之路开启
- 焦点!自主择业军转论坛网_全国自主择业军转干部管理服务工作平台
- 买笛子哪个调的比较好 买笛子哪个牌子好
- 校园鬼故事小说_关于校园鬼故事小说概略
- 【世界聚看点】把好计量"小关口" 切实服务"大民生"
- 职工困难户申请书范文(困难户申请书范文)
X 关闭
最新资讯
- 各地开展活动庆祝中国共产党成立102周年
- 天天要闻:你们我们他们 电视剧_你们我们他们
- 新能源行业重磅!“光伏茅”猛降硅片价格
- 金沙江流域水电工程劳动竞赛总结表彰大会暨金沙江清洁能源走廊建设劳动竞赛启动会召开_焦点观察
- 推动乡村文化振兴 江苏省书法院在溧水打造“书法乡村” 天天新动态
- 视频|历史一刻,首辆香港单牌车顺利驶入内地|全球新资讯
- 【全球快播报】癌症骨转移患者还能活多久啊_癌症骨转移患者还能活多久
- 杨兰英(关于杨兰英的简介)
- 对话尼山——“文明”上“网”
- 教育部和各地各高校积极行动 助力毕业生求职圆梦 速读
- 当前时讯:宝宝 最爱吃饭――0-3岁婴幼儿辅食添加全程制作方案
- 鸡小龙_关于鸡小龙简述
- 国城矿业:投资建设基础锂盐项目 每日看点
- 榴莲什么好处(榴莲的作用有哪些)
- 宝马3系18寸标准胎压是多少正常(宝马3系18寸标准胎压是多少?)
- 创造新模式、多方齐发力 美丽经济在山谷中绽放
- 厦门国贸10亿元超短债完成发行,发行利率2.23%|当前通讯
- 天天快报!游客注意!北京多家市属公园游船停航
- 如何去掉仪表盘上的小扳手图标_热文
- 栗赏木_关于栗赏木概略
- 成都到重庆火车票 重庆火车票_聚看点
- 深中华B6月30日盘中跌幅达5%
- 国内首次,北京4万余株古树名木体检“全覆盖”
- 机构:预计苹果Vision Pro头显上市后第五年用户将达2000万
- 环球焦点!世界即时看!离岸人民币(CNH)兑美元北京时间04:59报7.2686元 天天短讯
- 酒驾40多公里,从安徽到盱眙讨债,结果被欠债的举报了-全球微速讯
- 全球视点!6月29日基金净值:富国高质量混合最新净值0.7732,跌0.88%
- 焦点关注:cf是啥?(cf是什么意思游戏)
- 勒夏特列和楞次定律_勒夏特列
- 《国韵·匠心》视觉设计“礼”有型,“乐”有象-全球新视野
- 快讯2023-06-30 04:28:18
- 无痕_关于无痕介绍-世界新要闻
- LV总裁成都太古里出行,不仅挡路还不让拍照引热议! 当前焦点
- 2023年深圳(上海)外商投资促进交流会在沪举办
- 北江纺织IPO“终止” 公司产品包括牛仔面料、其他面料、服装
- 首批体育支教志愿者结束支教生活,“以学定教”为当地体育教学播下一颗种子 每日讯息
- 全球微资讯!多维康集团_康维多官网
- 第五届“新时代中国大讲堂”举行结业仪式 世界报道
- 雾道车灯几线品牌_vland车灯是什么品牌
- 栖林寺访德清法师_关于栖林寺访德清法师概略
- 世界今亮点!迪丽热巴与陈伟霆甜蜜浪漫相约 从古剑奇谭到奔跑吧
- 环球消息!95人上榜!榆林中院发布第34批失信被执行人名单
- 一场3比2让国足形势大好,满足3条件就提前出线,最差是打平晋级_当前通讯
- 世界观速讯丨中国北方十城市经济优势解析及发展建议
- 曝女模特脱下鞋扔向评委,怒吼:你个流氓,昨晚说好让我当冠军-今日视点
- 福州航空开展“茉莉”示范组进校园活动-环球聚焦
- 环球短讯!山西一煤矿发生顶板事故 已有3人获救 仍有1人被困
- 金通灵突遭立案,前期曾公告会计差错更正,股民可索赔-天天热点
- 全国多地地铁列车推分区控温,“强冷”“弱冷”车厢差2℃|当前热议
- 自然资源部发布2022年度全国矿产资源储量统计数据 中国石油六座油气田新增储量规模升级“大型” 环球热门
X 关闭