使用 IdentityServer 保护 Vue 前端 - 行业资讯 -

当前位置:首页  >  行业资讯  > 正文

使用 IdentityServer 保护 Vue 前端

使用 IdentityServer 保护 Vue 前端
2022-12-20 16:11:28
前情提要

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

标签:

(责任编辑:news01)
群里转账怎么隐藏金额-快看点

群里转账怎么隐藏金额-快看点

群里转账隐藏金额的方法:1、打开微信零钱,点击转账按钮。2、输入转账金额后,点击“隐藏金额”按钮。3...
05-20 10:11:18
资讯:某大型汽车经销商涉嫌掏空公司现金和资产?

资讯:某大型汽车经销商涉嫌掏空公司现金和资产?

--关注、星标、回复“40429”--↓↓领取:《汽车驾驶自动化分级》(GB T40429-2021)↓↓5月19日,*ST庞大
05-20 09:16:28
当前快讯:跨越智慧养老数字鸿沟

当前快讯:跨越智慧养老数字鸿沟

跨越智慧养老数字鸿沟---第九届中国国际养老服务业博览会近期在北京举办,人工智能机器人、生命体征监测设
05-20 08:59:04
北京今天北风明显并伴沙尘来袭 预计今起三天气温将呈现缓慢回升趋势

北京今天北风明显并伴沙尘来袭 预计今起三天气温将呈现缓慢回升趋势

由于缺少阳光,昨天本市的升温进程“受阻”,午后南郊观象台的最高气温定格在了20 5℃,较前期出现了明...
05-20 07:37:56
全球动态:创业的魅力没有人告诉你,深圳这份补贴你需要了解

全球动态:创业的魅力没有人告诉你,深圳这份补贴你需要了解

根据Tech星球和凤凰网科技的报道,ofo小黄车的创始人戴威已经开始了他的新一轮创业之旅,并选择在美国创业
05-20 04:56:11
客如云收银系统一套多少钱_客如云收银系统好用-速读

客如云收银系统一套多少钱_客如云收银系统好用-速读

1、这两个都是做智慧餐饮管理系统的,也就是给餐饮、商超加上互联网的翅膀,收银系统只是整个管理系统中的
05-20 02:58:59
争渡争渡惊起一滩鸥鹭原文_争渡争渡惊起一滩鸥鹭原文列述|环球快播

争渡争渡惊起一滩鸥鹭原文_争渡争渡惊起一滩鸥鹭原文列述|环球快播

1、原文2、《如梦令常记溪亭日暮》3、作者:李清照4、常常记起亭子旁小溪边的亭子,直到夕阳西下,陶醉于美
05-20 00:06:00
炎热boss要反季节突进,今夏确定热哭你?超算:副高或进河南山东

炎热boss要反季节突进,今夏确定热哭你?超算:副高或进河南山东

这两天,我国天气舞台的一个重要角色,是西风带中不断南下的冷涡。5月19日这天,从西伯利亚远道而来的冷涡
05-19 22:17:52
中国电建(601669):全球清洁能源建设龙头 投建营一体化转型重构价值 焦点消息

中国电建(601669):全球清洁能源建设龙头 投建营一体化转型重构价值 焦点消息

中国电建(601669):全球清洁能源建设龙头投建营一体化转型重构价值
05-19 21:28:32
今日关注:王力宏出庭老态毕露:离婚竟没有赢家?他缘何走到这一步丨晚八点娱闻

今日关注:王力宏出庭老态毕露:离婚竟没有赢家?他缘何走到这一步丨晚八点娱闻

从2021年12月15日被台媒曝出,王力宏已经和妻子李靓蕾办妥离婚手续至今,已经过去两年多的时间了。时至今日
05-19 20:49:46
G7峰会召开前,250多名各界人士联名发出呼吁_全球观焦点

G7峰会召开前,250多名各界人士联名发出呼吁_全球观焦点

参考消息网5月18日报道据今日俄罗斯电视台网站5月17日报道,当天,250多名前国家元首、内阁部长、外交官和
05-19 19:53:13
we世界冠军s3 we世界冠军

we世界冠军s3 we世界冠军

今天来聊聊关于we世界冠军s3,we世界冠军的文章,现在就为大家来简单介绍下we世界冠军s3,we世界冠军,希望
05-19 18:58:29
全球热点评!鲁梅尼格:曼城大热对国米是优势 国米有能力击败曼城

全球热点评!鲁梅尼格:曼城大热对国米是优势 国米有能力击败曼城

“在我看来马洛塔就是一位天才经理人,他只花很少的钱就建立起了一支欧冠决赛球队,当我还在拜仁任职的...
05-19 18:37:27
北欧有哪些国家组成

北欧有哪些国家组成

1、北欧(NordicEurope)是政治地理名词,特指北欧理事会的五个主权国家:丹麦、瑞典、挪威、芬兰、冰岛。2、
05-19 18:05:53
大学需要的“安静”,从来不是与世隔绝

大学需要的“安静”,从来不是与世隔绝

近日,高校校园开放成为热门话题。大学教授吐槽“进自己学校都麻烦”,成为最新的案例。北京某高校教授...
05-19 17:20:27
中国旅游日|文旅行业复苏强劲 年轻游客塑造当代旅游新气象

中国旅游日|文旅行业复苏强劲 年轻游客塑造当代旅游新气象

5月19日是第13个“中国旅游日”,受近期多项利好因素影响,文化和旅游行业复苏势头强劲,流动的中国折射...
05-19 17:03:00
世界消息!百元蕉下与“平价蕉下”,谁在贩卖“防晒焦虑”?

世界消息!百元蕉下与“平价蕉下”,谁在贩卖“防晒焦虑”?

蜗居在家3年的女生们,总结出了一套防晒可以抗初老、一白遮百丑的理论,直接助长了防晒化妆品市场的增长。
05-19 16:04:33
全球热议:Citigroup Inc.增持中远海能(01138)约69万股 每股作价约7.50港元

全球热议:Citigroup Inc.增持中远海能(01138)约69万股 每股作价约7.50港元

5月12日,CitigroupInc 增持中远海能(01138)68 9999万股,每股作价7 5016港元,总金额约为517 61万港元。
05-19 15:44:33
美国海军陆战队接收首批增程型MQ-9无人机

美国海军陆战队接收首批增程型MQ-9无人机

中国航空新闻网讯:据简氏防务网站5月18日报道,美国海军陆战队已接收前两架增程型MQ-9无人机,并计划部署
05-19 15:16:22
隔夜拆息升穿4.9厘 创超过15年半高|环球消息

隔夜拆息升穿4.9厘 创超过15年半高|环球消息

5月19日,香港银行公会数据显示,港元拆息持续全线上升,隔夜拆息升穿4 9厘,升至4 96583厘,较上日升0 225
05-19 14:38:21
承德露露董秘回复:公司目前聚焦主业,专注于植物饮品领域,致力于为消费者提供可信赖的植物饮品-报资讯

承德露露董秘回复:公司目前聚焦主业,专注于植物饮品领域,致力于为消费者提供可信赖的植物饮品-报资讯

承德露露(000848)05月19日在投资者关系平台上答复了投资者关心的问题。
05-19 14:05:16
【环球快播报】2023长春马拉松比赛几点结束?

【环球快播报】2023长春马拉松比赛几点结束?

2023长春马拉松比赛几点结束?根据竞赛规程,13:15结束比赛。竞赛时间:2023年5月21日(星期日)7:00-13:15赛
05-19 13:03:14
环球最新:黔西南州口腔种植医疗机构名单及专项治理落地执行情况

环球最新:黔西南州口腔种植医疗机构名单及专项治理落地执行情况

为全面落实口腔种植医疗服务收费和耗材价格专项治理措施,保障广大患者及时享受改革成果,按照《省医保局关
05-19 12:26:51
侵权井柏然公司因未支付2100元维权费用成老赖-当前播报

侵权井柏然公司因未支付2100元维权费用成老赖-当前播报

搜狐娱乐讯近日,天眼查App显示,因有履行能力而拒不履行生效法律文书确定义务,合肥小小莉文化传播有限公
05-19 12:03:27
世界热头条丨产能扩张加速,出货目标高增

世界热头条丨产能扩张加速,出货目标高增

第一时间提供各大券商研究所报告,最大程度减少个人投资者与机构之间信息上的差异,使个人投资者更早的了解
05-19 11:32:04
压货爆仓,价盘卖穿,国产奶粉能过“自己玩死自己”这一关?-最新消息

压货爆仓,价盘卖穿,国产奶粉能过“自己玩死自己”这一关?-最新消息

2022年达能中国所在的中国、北亚和大洋洲地区营收为34 3亿欧元,同比增长6 7%,其中,达能奶粉业务2022年在
05-19 10:53:42
惊险!柯洁压线入选亚运中国围棋队

惊险!柯洁压线入选亚运中国围棋队

北京时间5月18日,2023亚运会选拔赛男子组第二阶段的赛事收官,作为八冠王的柯洁在今天最后一轮战胜范廷钰
05-19 10:25:19
2023年江苏中级会计师报名实行资格前审:7月10日截止-全球最资讯

2023年江苏中级会计师报名实行资格前审:7月10日截止-全球最资讯

根据江苏省财政厅发布的《关于2023年度全国会计专业技术中级资格考试(江苏考区)考务日程安排及有关事项的
05-19 09:59:18
支持提高义务教育质量中国财政部下拨2270多亿元

支持提高义务教育质量中国财政部下拨2270多亿元

支持提高义务教育质量中国财政部下拨2270多亿元支持提高义务教育质量中国财政部下拨2270多亿元2023-05-1909
05-19 09:26:19
冷空气携大风沙尘侵袭北方 周末多地遭遇“换季式”降温

冷空气携大风沙尘侵袭北方 周末多地遭遇“换季式”降温

今明天(5月19日至20日),冷空气将携大风、沙尘、降温天气侵袭北方,局地遭遇“换季式”降温,降幅超10...
05-19 08:55:27

为您推荐

精彩推送