使用 IdentityServer 保护 Vue 前端 世界观速讯

2022-12-19 18:15:12

前情提要

《使用 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>

然后,需要在路由里配置好这个回调页面:

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文件。

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 请求添加认证头

最后,给 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

上一篇 :

下一篇 :

x 广告
高层声音

使用 IdentityServer 保护 Vue 前端 世界观速讯

2022-12-19

维峰电子:工控领域四季度承接订单较三季度有一定回升

2022-12-19

发布变更又快又稳?腾讯运维工程师经验首发

2022-12-19

内地与香港“生命接力” 实现“首例器官共享”成功挽救心脏衰竭女婴 当前速读

2022-12-18

快看:德媒:美欧央行应吸取“通胀之年”教训

2022-12-17

欧元区11月通胀率终值为10.1%|环球新视野

2022-12-17

环球今头条!利用示波器完成1553总线实时解码调试

2022-12-16

跌势不改!12月16日有色金属价格行情 每日动态

2022-12-16

热文:氮化镓板块11月1日涨3.5%,京泉华领涨,主力资金净流入3.77亿元

2022-12-16

许半夏靠收废品利器生,简直就是大女主 每日讯息

2022-12-15

突破科技 引领未来——福田汽车2023 产品发布会即将开始 全球百事通

2022-12-15

房屋产品质量纠纷维权一般来说应该怎样做会比较好?

2022-12-15

酒鬼酒董秘回复:公司销售白 酒计算消费税的方法为复合计征 独家

2022-12-14

《美国科学院院报》证实灵芝可以在体内外抑制新型冠状病毒感染

2022-12-14

罗莱生活: 第五届监事会第十八次(临时)会议决议公告

2022-12-13

濮阳普通工伤赔偿标准是什么-头条焦点

2022-12-13

天天热门:调研显示 大部分用户每两年更新智能手机

2022-12-13

16条举措促进房地产市场平稳健康发展

2022-12-12

当前速递!远大住工(02163):胡胜利获任总经理

2022-12-12

观热点:天龙集团(300063.SZ):拟定增募资不超2.665亿元、用于年产20000吨水性固体丙烯酸树脂扩建项目等

2022-12-09

华建集团(600629):华东建筑集团股份有限公司下属公司收到中标通知书|当前热闻

2022-12-08

神火股份董秘回复:请认真阅读上次的公司对新疆神火和云南神火的电解质锂含量均做过样本分析-全球微头条

2022-12-07

中海油服董秘回复:截至最新报告期末2022年9月30日普通股股东总数49,121

2022-12-06

深圳全力打造智慧兴农策源地 助力对口地区乡村振兴

2022-07-07

小米官方正式宣布:小米手环7将与Redmi Note 11T同步推出

2022-05-20

宁夏将村居法律顾问工作纳入法治政府考核

2022-03-18

律师兼任调解员 不打官司解纠纷

2022-03-18

青海2022年上半年英语四级报名时间:3月15日至3月18日

2022-03-18

人生第一桶金、与学业冲突……学生代购的“苦”与“乐”

2021-11-12

辽宁大连发布10日新增21例本土确诊病例行程轨迹

2021-11-12

纤维素制成闪光材料无毒可降解 或彻底改变化妆品行业

2021-11-12

新冠疫情期间 海洋中或堆积2.8万吨相关塑料废物

2021-11-12

开屏广告又现新花招,换个马甲就重来?

2021-11-12

对不合理教师资格认定标准,该全面清理了

2021-11-12

虚假宣传、以次充好 直播间商家“放水”让消费者闹心

2021-11-12

“扫码抽手机”实则是广告 快递单广告是谁发的?

2021-11-12

北京市本起疫情部分确诊病例病毒全基因组测序已完成

2021-11-12

辽宁大连本轮疫情病毒为德尔塔变异株 24个区域划定为中风险地区

2021-11-12

西安市鄠邑区太平峪首次发现野生川金丝猴踪迹

2021-11-12

成都停业整顿56家零售药店 买感冒药需提供身份证

2021-11-12

大连市启动第二轮全员核酸检测

2021-11-12

浙江衢州发现的西周墓葬群或为“姑蔑王陵”

2021-11-12

大连本轮疫情为德尔塔变异株

2021-11-12

大连:本轮疫情病毒载量高、传染性强 代际传播为2天左右

2021-11-12

25名干警获云南“最美政法干警”表彰

2021-11-12

甘肃凝聚“她力量”:互助抗疫,女人更懂女人心

2021-11-12

甘肃戈壁的“明星劳模”:自编自导让每一个工人唱“主角”

2021-11-12

跨越千山万水 浙江爱心“温暖”新疆沙雅孩子

2021-11-12

“钢轨神探”启5大铁路大动脉9300公里冬季“诊疗”

2021-11-12

重庆把接种点“搬”进小学,8岁学生:“我不怕疼,打疫苗是为抵抗病毒”

2021-11-12

四川绵阳:一男子酒后报警谎称自己是“黄码”被行拘10天

2021-11-12

民航局对多个入境航班发出熔断指令

2021-11-12

疫情中轮椅上的“逆行者”:想为大家做力所能及的事

2021-11-12

上海警方:“三无产品”借短视频平台引流诈骗近千名受害人

2021-11-12

山西搭建交通事故重伤员无差别急救绿色通道 累计救助7727个受困家庭

2021-11-12

三万余尾“水中大熊猫”放流新疆博斯腾湖(图)

2021-11-12

大连新增11个中风险地区

2021-11-12

陕西科技大学开设“酿酒课” 培养学生知行合一

2021-11-12

辽宁大连:今日新增十一个中风险地区

2021-11-12

“双十一”南京的猪都“脱单”了?其实还有更让人嫉妒的……

2021-11-12

内蒙古警方悬赏20万缉凶扎兰屯重大刑事案嫌疑人

2021-11-12

“帅府主题系列甜品”发布:孙中山喜食“牛奶煮苹果” 宋庆龄爱吃蛋糕

2021-11-12

江苏徐州“家门口车管所”便民服务驶入“高速路”

2021-11-12

重庆市发出今年秋冬季首次空气污染应对工作预警

2021-11-12

全国道德模范|深藏功名三十载 化作春蚕报乡亲——一名抗美援朝老兵的人生选择

2021-11-12

湖南桃江“花痴”男子盗窃六盆盆栽落法网

2021-11-12

成都25位民辅警的“封闭”生活:有人“转行”送外卖 有人变身“仓鼠管理员”

2021-11-12

2022年江苏中小学:体育教师师生比将达1:220

2021-11-12

国内首次!成都发布公园城市银杏观叶指数

2021-11-12

江苏学生体质健康监测报告:“小眼镜”“小胖墩”问题突出

2021-11-12

被拐17年 湖北宜昌警方助男子与家人团圆

2021-11-12

福建柘荣发现1例境外输入复阳病例 四名密接者核酸检测为阴性

2021-11-12

内蒙古额济纳旗达来呼布镇调整为低风险地区

2021-11-12

内蒙古现有本土确诊病例32例 伊金霍洛旗确诊病例清零

2021-11-12

交通陆续恢复 内蒙古通辽生产生活秩序逐步恢复正常

2021-11-12

选矿工技师的创新路:从废旧场“寻宝”到多技术攻关

2021-11-12

海外传播官体验宁波“十里红妆” 赞其“让人震撼”

2021-11-12

山西中小学幼儿园基本实现“4个100%”达标建设

2021-11-12

走近张家界“奇峰守护者”

2021-11-12

新华全媒+丨黑龙江黑河:他们在寒冬中战“疫”

2021-11-12

山东日照第一批五莲县外解除隔离人员返家 将继续进行7天居家健康监测

2021-11-12

中央气象台:未来几天我国大部天气将趋稳 东北雨雪进入尾声

2021-11-12

云南西双版纳:巾帼护村队化身边境村寨守护者

2021-11-12

乘客自发合力推车 “119”为“120”抢出一条急救通道

2021-11-12

中老联合考古队探索青铜冶炼遗址奥秘 结下“深厚情谊”

2021-11-12

黑龙江:抢修人员彻夜冒雪“破冰” 高铁列车逐步恢复运行

2021-11-12

内蒙古通辽:交通陆续恢复 生产生活秩序逐步恢复正常

2021-11-12

中国石油在京系统全面进入应急状态

2021-11-12

记者手记:采访他们10分钟,我的手都快冻僵了

2021-11-12

云南瑞丽畹町镇国防街片区调整为中风险地区

2021-11-12

女儿与父母失散18年 黔滇两地警方携手让爱“团圆”

2021-11-12

北京朝阳新增2名确诊病例 152名密接均已管控

2021-11-12

听冬奥制服设计师贺阳讲述“水墨长城”灵感从何而来

2021-11-12

纸短情长:一封道歉信“温暖”一座小城

2021-11-12

能订货还给免费代购 便民菜车如何办成“五年老店”

2021-11-12

买的床收货变清洁膏 小心收钱不发货的“跑路”电商

2021-11-12

北京:在京单位加强会议活动管理 提倡视频开会

2021-11-12

调查显示甘肃民众对战疫有信心

2021-11-12

手机APP自动续费这个“坑”该咋填?专家支招

2021-11-12

奔跑在无声世界的“李慢跑”:不走捷径才是最快的捷径

2021-11-12

北京海淀1地升为中风险 确诊病例轨迹涉地铁、小学

2021-11-12

“疫”下城市的邻里生活,不再是“相顾无言”

2021-11-12

未售出“空置房”需交物业费吗?法院判决开发商应按合同支付

2021-11-12

甘肃妇联发挥“联”字优势 近20万女性化身抗疫志愿者

2021-11-12

双十一快件“爆仓”来袭 投递服务成“投诉大户”

2021-11-12

辽宁:雪灾致640.50万头(只)畜禽死亡

2021-11-12

中国青少年抑郁检出率超2成 学生健康体检要筛查!

2021-11-12

清华贫困生“树洞里”装着励志之外的三重价值

2021-11-12

我国境内首宗个人破产清算案裁定

2021-11-12

夫妻档盗版黑手伸向《扫黑风暴》 警方:莫把盗版视商机

2021-11-12

深圳“医保药价通”上线 医保药品价格一键可查

2021-11-12

29岁父亲“割肝救女” 8月龄“小黄人”重获新生

2021-11-12

452支团队参加第二届海峡两岸(福州)职工创新创业创造大赛

2021-11-12

守护孤残儿童25年 她为2000多个孩子撑起一片天

2021-11-12

“双十一”来临 快递强市浙江金华加强“人物并防”

2021-11-12

江苏实施全生命周期监管将危废源头“一网打尽”

2021-11-12

不拘一格降人才 摘下有色眼镜看“第一学历”

2021-11-12

确诊患者曾就诊 北京东直门医院东城院区和国际部停诊

2021-11-12

云南10日新增2例本土确诊病例

2021-11-12

大数据分析表明昆虫多样性与碳排放密切关联

2021-11-12

将传统“家事”上升为重要“国事” 筑好育人的起点和基点

2021-11-12

档案人才培养现状:精通全流程的复合型人才较紧缺

2021-11-12

“献身航空事业,不是一阵子,而是一辈子”

2021-11-12

进博会:05后走上台前【最年轻“小叶子”仅16岁】

2021-11-12

高山峡谷里的“背包队”再出发

2021-11-12

高校师生科技抗疫 “彩虹丝口罩”让新冠病毒“迷路”

2021-11-12

当心“贴牌”!一些知名品牌授权商品质量存隐忧

2021-11-12

设立门店、科技赋能……“双十一”快递小哥这样送件进村

2021-11-12

疫情期间线办公需求猛增 AI刷新用户办公体验

2021-11-12

快递面单屡成“泄密单” 快递小哥如何为个人信息添把“锁”?

2021-11-12

冰雪中,有这样一群铁路人

2021-11-12

砒霜有望靶向精准治疗白血病

2021-11-12

珍视传统村落的精神文化价值

2021-11-12

“买买买”喧闹中,关注“不买组”的理由

2021-11-12

群众投诉279次置之不理 四川一家造纸企业缘何任性

2021-11-12

匿名社交真能找到“灵魂伴侣”吗

2021-11-12

教唆胁迫未成年人盗窃电动车 广西南宁警方抓获6人“拆车党”

2021-11-12

河北辛集市新增确诊病例3例 现有病例已治愈1例

2021-11-12

艰苦创业 团结协作——红旗渠精神述评

2021-11-12

新疆棉花专场新闻发布会侧记:“花开如雪海,人间免寒穷”

2021-11-12

历时14个月上万道工序 上海“爷叔”手工打造蒸汽小火车登上拍卖台

2021-11-12

河南一日新增13例本土确诊 省会6区展开第二轮全员核酸检测

2021-11-12

兰州“防疫网”基层抗疫干部的“十二时辰”

2021-11-12

王少杰:守护北京站辖区平安的“拼命三郎”所长

2021-11-12

清华贫困生“树洞”刷屏 “热源”不仅是“感动”

2021-11-12

四川成都:中高风险区周边区域酒吧、棋牌室等暂停开放

2021-11-12

大连公布新增21例确诊病例详情及轨迹 一名住校高中生确诊

2021-11-12

那年今日 | 哪一年的11月12日让你最难忘?

2021-11-12

云南新增1例本土确诊病例

2021-11-12

石家庄8770人核酸检测结果均为阴性

2021-11-12

创历史新高 11月1日—11日全国处理47.76亿件快件

2021-11-12

生动展现人与自然和谐共处

2021-11-12

喝上放心水 日子更甜美

2021-11-12

下“绣花”功夫,破解停车难

2021-11-12

就业 夯实民生之本

2021-11-12

歇人不歇店涉嫌违规 餐饮从业者可分时共享店铺吗?

2021-11-12

江西无新增本地确诊病例 新增无症状感染者2例

2021-11-12

新疆英吉沙“足尖舞者”逐梦老技艺 探索新传承

2021-11-12

预付款抢购却多花冤枉钱,“双十一最低价”都是套路?

2021-11-12

雪花放大100倍是什么样?小伙坚持15年拍雪花走红网络

2021-11-12

河北辛集市封控村已达97个、封控小区已达127个

2021-11-12

战地摄影师张崇岫:在长津湖一边躲子弹一边按快门

2021-11-12

近期去过北京朝阳这些场所的人员 请立即报告

2021-11-12

情感诈骗、个人隐私泄露……警惕“匿名社交”潜在风险

2021-11-12

内蒙古通辽市积极应对暴风雪天气

2021-11-12

吉林省新增本地确诊病例1例,为吉林市报告

2021-11-12

清华贫困生“树洞”为何让人感动?

2021-11-12

“草原母亲”都贵玛和她28个“国家的孩子”

2021-11-12

河南新增本土确诊病例12例 新增本土无症状感染者1例

2021-11-12

河北新增确诊病例2例 均在辛集市

2021-11-12

黑龙江新增本土确诊病例5例 均在黑河市爱辉区

2021-11-12

辽宁新增52例本土确诊病例 新增5例本土无症状感染者

2021-11-12

云贵等地多阴雨 东北部分地区最低气温创下半年来新低

2021-11-12

云南贵州多阴雨天气 全国其他大部地区以晴到多云为主

2021-11-12

吉林市新增一本土无症状感染者 轨迹公布

2021-11-12

北京新增6例本土确诊病例和1例无症状感染者

2021-11-12

浙江省台州市:从文明出发 让幸福落脚

2021-11-12

没有视频监控、目击证人……工地上意外受伤怎么作证

2021-11-12

吉林省吉林市:人民建城惠人民

2021-11-12

银川一小区调整为低风险地区

2021-11-12

北京朝阳连夜“快查严控” 采取果断措施阻断病毒传播链条

2021-11-12

“双减”后教培机构存逼迫辞退等乱象 员工如何维权?

2021-11-12

郑州44.77万名低龄儿童接种新冠疫苗第1剂

2021-11-12

国务院联防联控机制综合组到辽宁大连指导疫情处置工作并座谈交流

2021-11-12

北京来福士商场于11月11日起应疫情防控需求暂停营业

2021-11-12

内蒙古无新增确诊病例、疑似病例和无症状感染者

2021-11-12

青海西宁“抗疫”女警花:疫情不退 警察不退

2021-11-12

额济纳旗新增2例本土无症状感染者 开启重点地区、重点人群核酸检测

2021-11-12

成都“景美人更美”

2021-11-12

云南威信发生4.3级地震 暂无人员伤亡

2021-11-12

醉酒男派出所闹事 民警一查竟是网上追逃嫌疑人

2021-11-12

成都抗疫的外籍志愿者:愿为城市“康复”贡献力量

2021-11-12

云南昭通市威信县发生4.3级地震 震源深度10千米

2021-11-12

黑龙江省新增本土新冠肺炎确诊病例5例

2021-11-12

这位百岁老人在这家养老院免费吃住十年

2021-11-12

“非人类”签收不能成顽疾

2021-11-12

北京海淀5人核酸阳性 其中4人确诊1人为无症状感染者

2021-11-12

黑龙江省新增新冠肺炎本土确诊病例7例

2021-11-12

河南新增本土确诊病例13例 新增本土无症状感染者5例

2021-11-12

河北新增确诊病例3例 均在辛集市

2021-11-12

返回顶部