使用 IdentityServer 保护 Vue 前端-天天短讯
2022-12-19 01:25:34
前情提要

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

使用 IdentityServer 保护 Vue 前端-天天短讯

2022-12-19 01:25:34

环球热文:韩红为了儿子,究竟打脸多少人?

2022-12-18 14:31:57

恋爱曝光?白敬亭“注孤生”人设塌了?翩翩少年,演员归来,偶像远去|天天快资讯

2022-12-17 16:11:29

【天天热闻】今日如何查出老公是否出轨「11个简单技巧」

2022-12-17 01:38:00

河南省统计局:11月份社会消费品零售总额同比下降7.9%

2022-12-16 16:41:27

港股异动 | 希望教育(01765)盘中涨超14% 民办高等职业教育生源增加 扩容扩建需求旺盛_世界速讯

2022-12-16 10:40:37

瑞康医药: 瑞康医药独立董事对第四届董事会第二十五次会议相关事项的独立意见|天天快报

2022-12-15 22:57:28

天天热文:盖世食品(836826)12月15日主力资金净卖出21.53万元

2022-12-15 15:51:51

茅台岀手!耗资155亿扩产能,提升35%!还将首次实施特别分红,金额275亿! 今日讯

2022-12-15 10:20:44

美辰环保拟向银行申请不超过2000万授信实际控制人祝国亮及妻子提供个人全额连带责任保证担保|每日快看

2022-12-14 21:42:25

联环药业(600513)12月14日主力资金净卖出1218.08万元_天天热消息

2022-12-14 15:00:42

立方风控鸟·早报(12月14日) 速讯

2022-12-14 08:41:32

上海莱士: 关联交易管理办法:实时焦点

2022-12-13 18:33:45

江西昨日新增本土感染者2+1例

2022-12-13 11:10:50

环球今日讯!明阳电路: 深圳明阳电路科技股份有限公司可转换公司债券之债券持有人会议规则

2022-12-12 22:28:20

杰创智能董秘回复:该项目为公开招投标项目,中标价为270.58万元

2022-12-12 15:33:56

环球微资讯!ST起步董秘回复:公司会努力提升经营业绩

2022-12-12 08:24:04

立新能源:尚未涉及芯片半导体相关业务|每日动态

2022-12-09 11:08:10

“中国最强地级市”再抢先机 苏州经贸团明日包机赴欧-世界讯息

2022-12-08 10:01:41

【当前热闻】得润电子:公司目前重点发展新能源汽车车载电源管理模块业务,相关高压快充产品也已应用SiC材料

2022-12-07 06:51:49

知识 玻尿酸有哪些效果

2022-11-24 09:27:09

文化 开关插座哪个牌子最好

2022-11-24 09:25:33

《自然》:罕见“三重”拉尼娜气候事件可能出现

2022-06-29 14:48:23

克罗地亚政治分析家:北约扩张使世界和平变得更加脆弱

2022-06-29 14:48:23

美国4周新增儿童新冠感染病例超30万例

2022-06-29 14:48:21

胡春华在法中委员会紫色晚宴上发表视频致辞

2022-06-29 14:48:21

联合国海洋大会呼吁开启“海洋行动新篇章”

2022-06-29 14:48:18

人民财评:坚决对“好评返现”说不!

2022-06-29 14:48:18

卡萨帝:场景加持 实现与用户美好生活的深度连接

2022-06-29 14:48:14

邮储银行积极开展2022年防范非法集资宣传月活动

2022-06-29 14:48:14

国家发改委:适度超前布局有利于城镇化建设的基础设施

2022-06-29 14:48:11

习言道|“一国两制”是中国的一个伟大创举

2022-06-29 14:48:11

国家发改委:将全力支持香港深度参与共建“一带一路”

2022-06-29 14:48:08

学习关键词丨两张“云合影”背后的信心与期待

2022-06-29 14:48:08

国际粮食市场不确定因素增加,对我国有何影响?国家发改委回应

2022-06-29 14:48:05

国家发改委:将加强生猪产能调控 防止价格大起大落

2022-06-29 14:48:05

促进高校毕业生等青年群体就业 国家发改委还有这些“妙招”

2022-06-29 14:48:01

魏山忠:加快水利基础设施建设 为稳定经济大盘贡献力量

2022-06-29 14:48:01

国家发改委:适时推出新一批具有牵引带动作用的重大外资项目

2022-06-29 14:47:56

国家发改委:过去十年中国宏观调控思路注重5个方面

2022-06-29 14:47:56

交通运输部:全力以赴做好交通运输业纾困解难工作 积极扩大有效投资

2022-06-29 14:47:54

坚决维护老年人合法权益 公安机关抓获养老诈骗违法犯罪嫌疑人17510余名

2022-06-29 14:47:54

助力小微经济加速复苏 银联“红火计划”再延一年

2022-06-29 14:47:51

美媒:得州卡车内发现46具非法移民尸体,疑与人口走私有关

2022-06-29 14:47:51

十年来我国营商环境全球排名从第96位跃升至第31位

2022-06-29 14:47:48

观察:税收大数据定位 税收红利精准“滴灌”市场主体

2022-06-29 14:47:48

美国得克萨斯州执法人员27日在一辆卡车上发现至少20人死亡

2022-06-29 14:47:44

驱雷掣电,达地知根——记北京理工大学“全国高校黄大年式教师团队”

2022-06-29 14:47:44

今年能否实现GDP增速目标?国家发改委:有能力应对超预期变化

2022-06-29 14:47:39

十年来中国经济发展既保持了量的合理增长,也实现了质的稳步提升

2022-06-29 14:47:39

台湾新增28580例新冠肺炎确诊病例

2022-06-29 14:47:34

千年周敦颐、司马光个性化邮票发布

2022-06-29 14:47:34

阅读过大年 商务印书馆发布1月十大好书

2022-01-11 09:57:40

如何推动普通高中高质量发展?教育部详解

2022-01-11 09:57:40

教育部印发《普通高中学校办学质量评价指南》 含18项关键指标

2022-01-11 09:57:38

交通银行试点长三角区域抵押登记“跨省通办”

2022-01-11 09:57:38

2022年“文化进万家——视频直播家乡年”活动正式启动

2022-01-11 09:57:37

2022-02-11 14:56:06

2022-02-11 14:56:06

2022-02-11 14:56:06

2022-02-11 14:56:06

2022-02-11 14:56:06

国家发改委:春节和北京冬奥会期间重要民生商品价格将保持平稳运行

2022-01-11 09:57:33

2022-01-29 14:26:59

国家发改委:西安重点生活物资配送“最后一米”问题正加快解决

2022-01-11 09:57:31

人民热评:刘鑫被依法惩处,正义没有缺席!

2022-01-11 09:57:31

专访:RCEP将有力促进区域经济疫后复苏——访泰国商业部贸易谈判司司长奥拉蒙

2022-01-11 09:57:29

综述:英国累计新冠死亡病例超15万例 未来面临“艰难几周”

2022-01-11 09:57:29

如何实现工业废水高效循环利用?专家:聚焦重点分类施策

2022-01-11 09:57:28

2022-01-29 14:26:59

2022-01-29 14:26:59

2022-01-29 14:26:59

2022-01-29 14:26:46

杨国豪当选福建省厦门市人大常委会主任 黄文辉当选福建省厦门市市长

2022-01-11 09:57:25

2022-01-29 14:26:46

交通运输部:支持浙江建设共同富裕示范区 探索加快建设交通强国省域范例

2022-01-11 09:57:24

2021年我国民航完成固定资产投资1150亿元 超额完成年度投资目标

2022-01-11 09:57:23

比利时多位人士表达对北京冬奥会的支持

2022-01-11 09:57:23

2021年我国民航行业出台一揽子促发展措施 全年降成本近100亿元

2022-01-11 09:57:21

于学利当选辽宁省沈阳市政协主席

2022-01-11 09:57:21

2022-01-29 14:26:46

2021年我国民航运输航空实现持续安全飞行9876万小时

2022-01-11 09:57:20

推动创新创业向纵深发展 国家发改委打算这样干

2022-01-11 09:57:19

2022-01-29 14:26:32

西安群众如何就医?记者带你去看看

2022-01-11 09:57:17

民航局对国航、厦航、南航等八个入境航班发出熔断指令

2022-01-11 09:57:17

天津:划定封控区 全市开展全员核酸检测

2022-01-11 09:57:16

积极落实防控措施 多地全力抗击疫情

2022-01-11 09:57:16

工信部:鼓励新能源与智能网联汽车等领域建设产品质量大数据公共服务平台

2022-01-11 09:57:14

2022-01-29 14:26:32

工信部:针对年轻及国外消费群体发展低度化白酒产品

2022-01-11 09:57:13

民航局:2022年力争完成旅客运输量5.7亿人次 实现行业整体扭亏增盈

2022-01-11 09:57:13

北航举行2021-2022学年研究生毕业典礼暨学位授予仪式

2022-01-11 09:57:12

斯里兰卡总统戈塔巴雅会见王毅

2022-01-11 09:57:12

文旅部公示首批国家级旅游休闲街区名单

2022-01-11 09:57:11

2022年国家公务员考试 明起可申请调剂

2022-01-11 09:57:11

2021年“扫黄打非”十大数据公布

2022-01-11 09:57:08

2021年“扫黄打非”十大案件公布

2022-01-11 09:57:08

2021年“扫黄打非”工作综述:举旗亮剑 激浊扬清

2022-01-11 09:57:06

交通运输部:将引导19.61亿元社会资金投入交通运输科技研发

2022-01-11 09:57:06

浦银理财有限责任公司获批开业

2022-01-11 09:57:05

家庭服务需求迎旺季 58到家推出“不打烊”春节保姆服务

2022-01-11 09:57:05

北京倡导市民群众在京过年非必要不出京

2022-01-11 09:57:04

2022-01-29 14:25:55

英雄联盟手游城市赛总决赛落幕

2022-01-11 09:57:00

巨型雪人亮相哈尔滨松花江畔

2022-01-11 09:57:00

深圳:疫情阻击进行时

2022-01-11 09:56:58

2022-01-29 14:25:55

2022年国家公务员考试笔试成绩和合格分数线公布

2022-01-11 09:56:56

21部门:推动形成“15分钟”养老服务圈

2022-01-11 09:56:56

增强供应链合作 电子烟产业布局海外

2022-01-11 09:56:55

2022-01-29 14:25:55

一所群育学校的爱与希望

2022-01-11 09:56:53

彭京堂少将任驻香港部队司令员

2022-01-11 09:56:53

两岸专家:美日澳频打“台湾牌”加剧台海局势紧张

2022-01-11 09:56:51

人民网评:金色的盾牌,无悔的坚守

2022-01-11 09:56:51

数字政通:步入无人驾驶新赛道 与主线科技签署战略合作协议

2022-01-11 09:56:49

珠海高新区新政揽才 最高600万元住房补

2022-01-11 09:56:49

台胞在西安:“抗击疫情需要我们每一个人的力量”

2022-01-11 09:56:47

在京台生体验冰雪乐趣

2022-01-11 09:56:47

澳门未来发展有了新的时间表

2022-01-11 09:56:45

最高检:法治副校长应指导学校落实未成年人保护责任

2022-01-11 09:56:45

检察官担任法治副校长有了“指挥棒”

2022-01-11 09:56:44

全国首份《家庭教育令》来了!督促家长“依法带娃”

2022-01-11 09:56:44

俄军装甲车辆将具备隐身能力

2022-01-11 09:56:42

俄美双边对话 欧盟处境尴尬

2022-01-11 09:56:42

国资委:决战决胜国企改革三年行动 更好发挥国有经济战略支撑作用

2022-01-11 09:56:40

美海岸警卫队盯上濒海战斗舰

2022-01-11 09:56:40

证监会发布标准:统一金融行业对移动互联网应用程序的安全要求

2022-01-11 09:56:38

日本声称以电磁炮加强防御

2022-01-11 09:56:38

2022-01-29 14:25:17

江苏南京:上万块显示屏支撑征兵宣传

2022-01-11 09:56:36

2022-01-29 14:24:59

广东省汕头市组织军地海上联合搜救演练

2022-01-11 09:56:35

2022-01-29 14:24:59

山东省枣庄军分区组织两级首长机关野营拉练

2022-01-11 09:56:33

2022-01-29 14:24:59

83年后,“故乡土”撒在烈士墓前

2022-01-11 09:56:32

岛与岸的守望:你的岛,我的岸

2022-01-11 09:56:30

2022-01-29 14:24:59

愿你们也平平安安!这支MV献给人民警察

2022-01-11 09:56:29

集安组织将就哈局势举行视频峰会

2022-01-11 09:56:29

美俄新一轮战略稳定对话前景不容乐观

2022-01-11 09:56:27

我第12批赴南苏丹(瓦乌)维和医疗分队开展紧急救援演练

2022-01-11 09:56:27

第二轮第五批中央生态环境保护督察全面完成督察进驻工作 已受理有效举报9656件

2022-01-11 09:56:25

空军某旅组织实弹打靶训练

2022-01-11 09:56:25

江秋莲诉刘暖曦生命权纠纷案一审宣判

2022-01-11 09:56:22

2022-01-29 14:24:44

新疆军区某团侦察连官兵边关巡逻

2022-01-11 09:56:19

第78集团军某旅实战化演练设强对手设难情况

2022-01-11 09:56:19

军队医疗待遇保障新规定如期落地有序施行

2022-01-11 09:56:17

2022-01-29 14:24:44

2022-01-29 14:24:07

荣盛发展:2021年签约金额1345.58亿元 同比增长5.87%

2022-01-11 09:56:15

2022-01-29 14:24:07

2022-01-29 14:24:07

证监会发布《关于北京证券交易所上市公司转板的指导意见》

2022-01-11 09:56:12

2022-01-29 14:24:07

2022-01-29 14:24:07

奥密克戎高速传播 美国医疗物资供应无法满足病毒检测需求

2022-01-11 09:56:10

原住民控诉美政府在其家园进行“900次核试验”:这是种族清洗!

2022-01-11 09:56:09

2022-01-29 14:24:07

2022-01-29 14:23:52

2022-01-29 14:23:52

奥密克戎肆虐 美国公共服务受重创

2022-01-11 09:56:06

公安部1月10日举行新闻发布会

2022-01-11 09:56:06

詹姆斯·韦伯太空望远镜顺利“完全部署”

2022-01-11 09:56:04

日美联合委员会发布声明:驻日美军离开基地将仅限于必要活动

2022-01-11 09:56:04

致敬·选择

2022-01-11 09:56:03

《我们北京见》 来自55位世界冠军的邀约

2022-01-11 09:56:03

世界冠军进校园 小小少年感受运动乐趣

2022-01-11 09:56:00

2022-01-29 14:23:52

时政Vlog丨带你体验冬奥运动员的备战日常

2022-01-11 09:55:58

伊朗制裁51名参与暗杀高级将领苏莱曼尼的美国人

2022-01-11 09:55:58

今年要有序推动绿色低碳发展

2022-01-11 09:55:51

加强同乡村振兴有效衔接

2022-01-11 09:55:51

加强绿色合作 助力共同发展

2022-01-11 09:55:49

电力碳减排要开好局(点睛)

2022-01-11 09:55:49

风光互补 绿能满满

2022-01-11 09:55:47

推动能源转型 赋能绿色发展(经济聚焦·关注碳达峰碳中和)

2022-01-11 09:55:47

今日腊八:两乡侈各健,一粥喜遥同

2022-01-11 09:55:44

2021年生态环境领域8项约束性指标顺利完成

2022-01-11 09:55:44

欧盟推进塑料回收再利用

2022-01-11 09:55:42

国家植物园 让保护体系更完整(美丽中国)

2022-01-11 09:55:42

2022-01-29 14:23:20

借力外脑,河南打出农业工程技术创新“组合拳”

2022-01-11 09:55:39

2022-01-29 14:23:20

国家速滑馆“冰丝带”“超级大脑”上线

2022-01-11 09:55:37

2022-01-29 14:23:20

农田被淹、住宅停电、出行受阻……美国多地遭遇持续恶劣天气

2022-01-11 09:55:35

自动驾驶已“接单” 下一站开往大规模商业化

2022-01-11 09:55:34

2022-01-29 14:23:20

第四集《精兵作战 精兵制胜》

2022-01-11 09:55:31

科普专项行动让老年人跨越数字鸿沟

2022-01-11 09:55:31

令人身临其境 8K服务让北京冬奥会更精彩

2022-01-11 09:55:29

嫦娥五号探测数据显示:采样区一吨月壤约含一百二十克水

2022-01-11 09:55:29

太曲折!交给美军后丢失的男婴 找到了

2022-01-11 09:55:27

科技创新助力 渤海油田成为我国第一大原油生产基地

2022-01-11 09:55:27

全球新纪录!本体热效率达51.09%柴油机诞生

2022-01-11 09:55:26

2022-01-29 14:22:53