当前位置: 首页>行业 >

使用 IdentityServer 保护 Vue 前端-世界热头条

来源: | 时间: 2022-12-19 03:13:16 |

前情提要

《使用 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 前端-世界热头条

前情提要《使用IdentityServer保护Web应用(AntDPro前端+SpringBoot后端)》中记录了使用IdentitySer

2022-12-19

广元17岁孩子抚养费收取标准 快播报

1、有固定收入的,抚育费一般可按其月总收入的百分之二十至三十的比例给付。负担两个以上子女抚育费的,比例可适当提高,但一般不得超过月总收

2022-12-18

霸屏!今年公募前三名都被他包揽?"准冠军"基金经理黄海:投资是一场精心策划的战役!重仓煤炭原因是... 世界今热点

▲万家基金副总经理、投资总监、基金经理黄海在基金业绩平均数为负的2022年,今年的“准”公募冠军做对了什么。战略层面,黄海早在去年下半年

2022-12-17

李湘一家三口同框直播,11岁王诗龄身材圆润皮肤黢黑,脸比妈还大

李湘和王岳伦的女儿王诗龄可以说是在网友眼皮子底下长大的星二代了,自从《爸爸去哪儿》播出后,可爱的angle王诗龄就收获了不少妈妈粉,随着时

2022-12-17

运力不足!北京多区倡议:大家有空都来送外卖

12月16日,北京市丰台区商务局发布关于参与外卖配送服务的倡议,倡议中提到,在个人及家庭允许的情况下,在确保自身身体健康的条件下,。如您

2022-12-16

重点聚焦!2022「F40中国青年投资人」揭晓

清科创业旗下创业与投资资讯平台——投资界连续五年发起「。F40中国青年投资人。一方面,越来越多来自人民币基金的投资人崭露头角,他们活跃在

2022-12-16

台中水湳派出所揭牌 女警正装接待

台中市警察局第五分局15日举办“水湳派出所扩建启用典礼”,中国国民党籍台中市长卢秀燕亲自出席主持揭牌,警局特别安排女警着正式礼服担任礼

2022-12-16

开润股份: 关于第三届董事会第四十三次会议相关事项的独立意见|全球今头条

开润股份:关于第三届董事会第四十三次会议相关事项的独立意见

2022-12-15

海洋联盟DAY7航线产品发布 为集装箱航运发展增添韧性

在跌宕起伏的前行途中,市场形势风云变幻,行业发展日新月异,新的一年,航运市场走势如何?有哪些新的趋势与特点?12月7日,合作运力位居业界

2022-12-15

弘业股份: 弘业股份关于召开2022年第三次临时股东大会通知

证券代码:600128         证券简称:弘业股份          公告编号:2022-066                 江苏弘业

2022-12-14

毅昌科技(002420)12月14日主力资金净卖出8756.31万元

截至2022年12月14日收盘,毅昌科技(002420)报收于9 99元,下跌10 0%,跌停,换手率23 2%,成交量90 43万手,成交额9 34亿元。

2022-12-14

海利得(002206)12月13日主力资金净卖出1064.75万元 每日快报

截至2022年12月13日收盘,海利得(002206)报收于6 66元,下跌3 06%,换手率1 72%,成交量15 63万手,成交额1 05亿元。12月1

2022-12-14

专科生如何备考注册会计师 当前看点

专科生这样备考注册会计师:1、制定好科学的备考计划并严格遵守;2、学会听课,好好做课后训练,把所学知识点巩固起来;3、梳理知识框架,能够

2022-12-13

环球关注:31省份11月CPI出炉 仅海南同比涨幅超过上月

12月13日,继国家统计局公布了31省份2022年11月居民消费价格指数(CPI)之后,31个省统计局也各自发布了省CPI 北京商报记者梳理发现,11月,31省

2022-12-13

当前快讯:网贷逾期98万会有哪些严重后果

1、产生罚息这是金钱上的损失。如果信用贷款出现逾期,贷款机构会先电话催收贷款,提醒借款人还款,同时利率还会上浮,作为每天的罚息。虽然每

2022-12-13

天天视讯!拾比佰(831768):[临时]:独立董事提名人声明(高雁鸣)

2022年12月12日公告发布

2022-12-12

每日头条!华统股份董秘回复:公司会按相关规则履行信息披露义务

华统股份(002840)12月12日在投资者关系平台上答复了投资者关心的问题。投资者:已经有上市公司发年报预告了,请问贵公司年报预告啥时候出来华

2022-12-12

英可瑞:800v高压充电模块产品属于公司产品之一

(原标题:英可瑞:800v高压充电模块产品属于公司产品之一)同花顺(300033)金融研究中心12月9日讯,有投资者向英可瑞(300713)提问,请问贵司是否

2022-12-09

凯盛新材(301069.SZ)股东鸿泰创盈持股比例减少至5%以下 天天新视野

(原标题:凯盛新材(301069 SZ)股东鸿泰创盈持股比例减少至5%以下)智通财经APP讯,凯盛新材(301069 SZ)发布公告,公司于近日收到公司股东淄博

2022-12-08

晶盛机电(300316)12月6日主力资金净卖出3743.83万元 前沿资讯

截至2022年12月6日收盘,晶盛机电(300316)报收于67 41元,上涨3 09%,换手率1 24%,成交量14 89万手,成交额9 94亿元。12月6日

2022-12-07

资讯

胡松辉:澳门特区正在努力争取承办CBA赛事

昨晚,第六届粤澳杯第二回合的比赛在恩平体育中心落下帷幕,广东队以89∶77赢下比赛。两回合比赛,广东队以177∶160的优势获得本届比赛的冠

2022-07-08     
北京推出14条秋游文化线路

金秋时节,北京市文化和旅游局以赏银杏品文化为主题,推出14条“叶落的季节——漫步北京赏银杏品文化主题线路”,邀市民和游客以步行、骑行

2021-10-27     
基因编辑发力 培育高质量人源化供体猪

此次人体试验,仅仅验证了基因编辑猪克服异种器官移植的超急性排斥反应,还需解决延迟性排斥反应、消耗性血栓等问题。但通过这次试验,能更

2021-10-27     
中国经济高质量发展步伐稳健 长期向好基本面未变

在全球疫情走势和经济走势趋于复杂的背景下,中国经济巨轮将驶向何方,举世关注。2020年10月26日至29日,党的十九届五中全会在京举行,明确

2021-10-27     
南美解放者杯决赛允许近4.5万观众入场

南美洲足联主席多明格斯25日与今年解放者杯决赛对阵的两支俱乐部负责人会晤,宣布决赛现场观众人数增加到球场容量的75%,即近4 5万人。今年

2021-10-27     
22年从警生涯 面对荣誉他说不要给我报功

9月24日,时任安徽省安庆市公安局迎江分局刑警大队大要案中队中队长周磊因在工作中激烈搏斗引发心源性猝死,倒在了工作岗位上,经医院抢救

2021-10-27