首页 > 滚动 > > 内容页

使用 IdentityServer 保护 Vue 前端

2022-12-19 10:42:52
前情提要

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

鹤壁5G产业园被认定为“中国侨联新侨创新创业基地”:今日看点

2022-12-18

世界即时:最高200架波音787!美联航签下美国航司史上最大宽体机订单

2022-12-17

全球速讯:孩子七岁抚养费怎么算

2022-12-17

加强巡查 严格执法 湖北多措并举确保防疫药品价格稳定

2022-12-16

国泰君安2023年钢铁业策略:需求预期从底部逐步抬升 静待困境反转

2022-12-16

烟台 今日金价多少一克|世界时讯

2022-12-15

只做富人的生意?香奈儿爱马仕等奢侈品牌开始抛弃大众消费者

2022-12-15

遥望科技董秘回复:公司会积极考虑的,可以继续留意公司直播间的商品情况

2022-12-15

美诺华: 宁波美诺华药业股份有限公司监事会关于激励对象名单出具的书面核查意见-焦点信息

2022-12-14

孟津区朝阳镇三彩文创产品实现频频“破圈”-快播报

2022-12-14

观速讯丨北京发布研考提醒:未返京考生尽早返京备考,在京考生非必要不外出

2022-12-14

岭南股份(002717):股东减持计划期限届满-视点

2022-12-13

ST热电:我们努力在这个寒冬为大家带来温暖,如有供暖问题请拨打83602222_每日热点

2022-12-13

天天快讯:鼎通科技: 首次公开发行战略配售限售股上市流通公告

2022-12-12

【世界热闻】天津联通林亭口综合网格智家工程师团队:我的百倍用心,愿您十分满意!

2022-12-12

中国移动联合合作伙伴启动算力网络科学装置-热点

2022-12-11

最高法:加强人工智能应用顶层设计 加强司法数据中台和智慧法院大脑建设

2022-12-09

冠豪高新董秘回复:公司印刷板块业务与国药集团、丽珠制药等大型医药公司均有合作,产品涵盖感冒类药品包装盒 焦点报道

2022-12-08

美股异动 | 名创优品(MNSO.US)涨近6% 此前获瑞银首予“买入”评级 天天时讯

2022-12-06

秦皇岛市总探索新就业形态劳动者建会入会新路径

2022-03-18

国家卫健委:家庭医生签约服务“最后一公里”有望打通

2022-03-18

截至2021年底 全国乘用车产能利用率仅为52.47%

2022-03-18

教培机构如何合理处理与员工的劳动关系?

2022-03-18

夫妻二人用工业硫磺熏制竹笋 查获20余吨

2022-03-18

虚假宣传等老问题占比较大 车主权益如何保障?

2022-03-18

有人不解,有人转型……多地发布建筑业清退令

2022-03-18

避坑越来越难?安心消费呼唤监管亮出科技之剑

2022-03-18

政策春风“吹暖”市场预期 A股港股双双走强

2022-03-18

用人单位用“盲盒岗位”招聘引发公众热议

2022-03-18

金稳委重磅发声 共同维护资本市场稳定发展

2022-03-18

三部门: 加快推动城市货运配送体系 绿色低碳发展

2022-03-18

露天滑雪场运动员怎么上厕所?马桶藏着黑科技

2022-02-15

安徽16岁弟弟捐献造血干细胞救24岁哥哥

2022-02-15

广州一大型商场因疫情防控需求暂时封闭

2022-02-15

江苏苏州一地调整为中风险地区

2022-02-15

辽宁调派移动方舱检测车10台、496人支援葫芦岛疫情防控

2022-02-15

【新春走基层】田坎上来了乡村振兴工作队

2022-02-15

七旬养猪老汉系外省命案逃犯 持刀杀人潜逃13年后宿迁落网

2022-02-15

驻哈中企员工的“别样团圆”

2022-02-15

1月中国各种自然灾害造成42.2万人次受灾

2022-02-15

中国空间站、首次火星探测等入选2021年度十大科普事件

2022-02-15

广西百色疫情社区传播链基本阻断 社会面基本实现清零

2022-02-15

上海:禁止企业采用“最严算法”考核、遏制“以罚代管”

2022-02-15

上班时间向招聘网站投简历被裁 媒体:职场数字化管理别

2022-02-15

甘肃高校数百名大学生“云支教” “打卡”互动零距离育人

2022-02-15

广西百色:社会面基本清零 健康码转码工作有序开展

2022-02-15

广西贺州“碰瓷女王”重操旧业 再度入狱

2022-02-15

外卖小哥热汤圆吃出幸福感 生活不易愿被社会温柔以待

2022-02-15

冬奥邂逅元宵:外籍主播侨乡浙江文成“闹元宵”

2022-02-15

青岛检察机关开展学生安全保护专项监督活动

2022-02-15

等待两年,只为8分钟的相见

2022-02-15

运用数字技术打造劳模工匠服务管理新模式

2022-02-15

预制菜“大热”元宵餐桌 中国 “Z世代”成掌勺主力

2022-02-15

辽宁推进法院审级职能定位改革

2022-02-15

杭州西湖景区旅游法庭揭牌

2022-02-15

拓展乡村振兴的数字蓝海

2022-02-15

山东泰安:提升执法司法质效 让执法监督长出“牙齿”

2022-02-15

农机助力 种地省心

2022-02-15

监狱人民警察用言行诠释忠诚

2022-02-15

扎根中国大地 办出中国特色 争创世界一流

2022-02-15

守护海陀之巅 走近国内第一支专业高山救援队

2022-02-15

内蒙古满洲里:2月1日以来到过满洲里人员全部落实管控措施

2022-02-15

“0蔗糖”就是无糖、不渴不用喝水等谣言入选2021年度十大

2022-02-15

广西:监督推动乡村振兴政策项目资金落地见效

2022-02-15

把算法开关交给消费者 以保障消费者权益

2022-02-15

二七厂蝶变:科技自立自强

2022-02-15

从货担郎到日售数千斤 兰州手艺人40余载“滚”元宵留年

2022-02-15

大陆学生在台度春节:不一样的年味与团圆

2022-02-15

广东惠州全市全部封控管控解除

2022-02-15

为人民健康提供可靠保障

2022-02-15

青海藏族女孩小拉毛春节“重生记”

2022-02-15

让群众遇事不烦办事不难

2022-02-15

河南晒出2021年交通“成绩单”:村村通、户户通 农村公

2022-02-15

芥末味、芽菜臊子味……“怪味”汤圆求上桌,你会相中谁

2022-02-15

山东青岛:楼宇经济体劳动争议预防调解联盟成立

2022-02-15

电力巡线工“偏向虎山行”

2022-02-15

身边小商铺 连着千万家

2022-02-15

听!城市的脉动

2022-02-15

每一度温暖的背后

2022-02-15

一男子地铁站晕倒休克 路过女护士出手相救

2022-02-15

河南中小学将迎开学季 多地要求返校师生须核酸检测

2022-02-15

安徽新增1例无症状感染者 系境外输入

2022-02-15

冰墩墩设计者给北京四中学生回信:祝福可爱奋进的中国少

2022-02-15

江苏南通发现1人检测结果呈阳性 系外地返通人员

2022-02-15

湖南郴州报告2例香港返湘人员新冠肺炎确诊病例

2022-02-15

广西百色疫情社区传播链基本阻断

2022-02-15

广西新增1例本土确诊病例 本轮本土疫情累计报告确诊病例

2022-02-15

葫芦岛市两医院不再收治非绥中地区患者 就医患者闭环管理

2022-02-15

苏州14日新增本土确诊1例,无症状感染者3例 详情及轨迹公布

2022-02-15

2021年北京空气质量创历史最优 首次全面达标

2022-02-15

化屋村火起来了

2022-02-15

质量问题、精装修变“惊装修”......买房坑有多深?

2022-02-15

心安之处便是“家”——深圳水尾村见闻

2022-02-15

江苏发现一处面积约1475平方米唐代建筑基址

2022-02-15

青海共和县:发电放牧两相宜

2022-02-15

应急管理部:截至1月底查出烟花爆竹问题隐患28052项

2022-02-15

福建蕉城:古建筑里古韵悠长 琴筝齐鸣庆元宵

2022-02-15

单日新增28例 辽宁省葫芦岛市本轮疫情累计确诊89例

2022-02-15

一言不合放火烧家 任性女子被判刑

2022-02-15

新疆阿克苏地区库车市发生3.4级地震 震源深度7千米

2022-02-15

应急管理部:1月全国接报生产安全事故死亡超1100人

2022-02-15

畲乡少年小雷的团圆年

2022-02-15

心安之处便是“家”——深圳水尾村见闻

2022-02-15

江苏发现一处面积约1475平方米唐代建筑基址

2022-02-15

青海共和县:发电放牧两相宜

2022-02-15

应急管理部:截至1月底查出烟花爆竹问题隐患28052项

2022-02-15

福建蕉城:古建筑里古韵悠长 琴筝齐鸣庆元宵

2022-02-15

单日新增28例 辽宁省葫芦岛市本轮疫情累计确诊89例

2022-02-15

一言不合放火烧家 任性女子被判刑

2022-02-15

新疆阿克苏地区库车市发生3.4级地震 震源深度7千米

2022-02-15

应急管理部:1月全国接报生产安全事故死亡超1100人

2022-02-15

江苏省省长:苏州市要把疫情防控作为头等大事、第一要务

2022-02-15

广西新增确诊病例降至1例 百色市有序解除管控

2022-02-15

江苏:采取更加坚决果断措施迅速打赢苏州疫情防控战

2022-02-15

深圳调整跨境货车内地接驳司机核酸检测为每日一检

2022-02-15

绥芬河市15日起全域转为低风险地区

2022-02-15

黑龙江省新增境外输入确诊病例1例

2022-02-15

黑龙江绥芬河市全域调整为低风险地区

2022-02-15

广西百色疫情外溢风险已得到有效控制 社区传播基本阻断

2022-02-15

多名和尚尼姑聚餐并分钱?五台山佛协:非本地僧众 已报警

2022-02-15

江苏新增本土确诊8例、本土无症状感染者4例 均在苏州

2022-02-15

甘肃“真金白银”助中小微企业稳岗扩岗

2022-02-15

满洲里发现5例核酸阳性人员 所有居民开展全员核酸检测

2022-02-15

广西新增本土确诊病例1例 百色市报告

2022-02-15

辽宁省新增18例本土确诊病例 其中葫芦岛市报告17例

2022-02-15

广东新增本土确诊病例2例 为深圳市报告

2022-02-15

吉林黑龙江新疆等地仍有降雪 中东部将再有大范围雨雪

2022-02-15

元宵节北京多云山区有零星小雪 最高气温仅零下1℃

2022-02-15

广西靖西市两地调整为中风险地区

2022-02-15

苏州市多地调整为中风险地区

2022-02-15

云南2月14日新增无症状感染者6例

2022-02-15

实体书店为什么接二连三遭遇危机?生存之道在哪

2022-02-15

卜卦、占星、看手相…… 为什么有的年轻人总想算一卦

2022-02-15

开学倒计时 如何帮助孩子克服“开学综合征”

2022-02-15

十赌十输,为何还有人铤而走险?

2022-02-15

网络赌博花样百出难逃警方天罗地网

2022-02-15

上海“最严动迁”迁出最暖“母子情”的背后

2022-02-15

《狙击手》原型邹习祥:比电影更传奇的“冷枪英雄”

2022-02-15

苏州市多地调整为中风险地区

2022-02-15

打造“无废城市”,深圳的固体废物都去哪了?

2022-02-15

北京冬奥会开幕式滑雪萌宝:在旅途中烂漫长大

2022-02-15

快判冰墩墩盗版案,用法治为冬奥护航

2022-02-15

“雪道的尽头是骨科”?不必夸大冰雪运动的风险

2022-02-15

疫情外溢风险有效控制 广西百色局部解封

2022-02-15

“萌妹子班组”深夜守护中老铁路“绿巨人大脑”

2022-02-15

知乎否认安装和使用过“行为感知系统”

2022-02-15

福建漳州一货车撞人 致3死9伤

2022-02-15

深圳新增2例本土确诊病例 为入境旅客隔离酒店工作人员

2022-02-15

广西百色宣布解除“不进不出”管控措施

2022-02-15

2月15日零时起 苏州市关闭15个高速公路入口

2022-02-15

“95后”羌族货运员的春运:为中欧班列尽一份力

2022-02-15

养牛场里的“春节时光”

2022-02-15

赏非遗、玩游戏、看展演、触彩蛋......广府元宇宙首亮相

2022-02-15

松山湖隧道内的“青春舞者”

2022-02-15

消费者购买预售商品房权益受侵害问题突出

2022-02-15

铁道部退票最新通知:旅客列车车票免费退票

2022-02-15

浙江农民大学生的“共富经”:打造“瓜果王国” 年产值

2022-02-15

踏雪闹元宵 北京市属公园推出14项元宵节文化活动

2022-02-15

北京冬奥会张家口赛区公交调度员是怎样工作的?

2022-02-15

铁路人的春运时刻:在列车里过年 在站台上过节

2022-02-15

福州长乐机场海关连续查获人体胎盘素注射液400支

2022-02-15

山西民间艺人巧手剪纸贺元宵 盼传承传统技艺

2022-02-15

京津冀迎强降雪天气 交通运输部门护航平安春运

2022-02-15

纸短情长!来自北京冬奥会志愿者的一封家书

2022-02-15

看皮影、写春联、扭秧歌:内蒙古小镇年味浓

2022-02-15

山西小城一名下岗职工的人生逆袭:“弹棉花”弹出千万身

2022-02-15

开学首日 广东多地海事部门贴心护航“学生渡”

2022-02-15

福州:弘扬福文化 传承好家风

2022-02-15

长春七旬“国旗奶奶”带领居民升旗十年

2022-02-15

云南麻栗坡县新增病例均为集中隔离点发现

2022-02-15

云南临沧:“双警”家庭为爱守边

2022-02-15

深圳口岸又检测出12名跨境货车司机核酸阳性

2022-02-15

辽宁疫情持续一周 本土确诊连续五天超10例

2022-02-15

琼浙一对珍稀长臂猿情人节喜结良“猿”

2022-02-15

苏州新增8例新冠病毒阳性感染者 病毒溯源为奥密克戎变异株

2022-02-15

辽宁葫芦岛市成立74个监督检查组 发现并纠正问题71个

2022-02-15

广西百色疫情呈下降趋势 医护人员哽咽讲述艰辛经历

2022-02-15

“双减”落地后首个寒假 内蒙古各地学生这样过

2022-02-15

数码摄影时代 广西“胶片迷”的别样坚持

2022-02-15

山东听障漫画师执笔为冰雪健儿加油 以“奥运长卷”献礼

2022-02-15

浙江金华侨领张磊:拳拳赤子心 浓浓家乡情

2022-02-15

杭州西湖残荷开始收割清理 150亩荷花4月可见小荷尖角

2022-02-15

2021年浙江电信网络诈骗立案6.5万起、损失38.97亿元

2022-02-15

自然资源部:1月全国共发生地质灾害25起 造成1人受伤

2022-02-15

苏州发布关于“苏康码”赋黄码和转码有关事项的通告

2022-02-15

依托劳动技能大赛,新乡市去年1.5万余名职工提升职业技能

2022-02-15

中原油田推进改革攻坚和经营管控,实现生产能力和经营水

2022-02-15

苏州公布7例新冠肺炎确诊病例、1例无症状感染者活动轨迹

2022-02-15

未到过中高风险地区健康码变黄码或红码如何转码?广西百

2022-02-15

天津一商家销售“冰墩墩”蛋糕被查

2022-02-15

这个春节,年俗年货多了这些“新元素”

2022-02-15

成都老旧小区新春“焕新颜”

2022-02-15

安徽临泉:春运“赛场” 争分夺秒的“暖墩墩”

2022-02-15

七旬老太乘坐商场扶梯摔伤 索要赔偿被法院驳回

2022-02-15

上海:加强对国内疫情中高风险地区等来沪返沪人员健康管

2022-02-15

广西百色疫情总体呈波动下降趋势 扩散、外溢风险将逐

2022-02-15

新疆克孜勒苏州乌恰县发生3.3级地震 震源深度22千米

2022-02-15

山东青岛新增14例中国籍境外输入确诊病例

2022-02-15