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

世界微资讯!使用 IdentityServer 保护 Vue 前端

世界微资讯!使用 IdentityServer 保护 Vue 前端
2022-12-20 00:33:13
前情提要

《使用 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)
世界微资讯!使用 IdentityServer  保护 Vue 前端

世界微资讯!使用 IdentityServer 保护 Vue 前端

前情提要《使用IdentityServer保护Web应用(AntDPro前端+SpringBoot后端)》中记录了使用IdentitySer
12-20 00:33:13
当前焦点!大盘收杀跌长阴 3100点一度失守

当前焦点!大盘收杀跌长阴 3100点一度失守

周一早盘上证指数小幅低开,但之后大盘走出单边的杀跌。午后大盘一度跌穿3100点,最低探出3096的低点。...
12-19 16:25:44
5 年的前端成长计划 - 仅剩 300 名额 - 打破职业发展壁垒

5 年的前端成长计划 - 仅剩 300 名额 - 打破职业发展壁垒

早早聊5年天使票预售倒计时,还剩300名额~这次我们拿出了最大的诚意,对大会服务做了全面升级。天使年...
12-19 11:05:22
热文:“车看灯”变成“灯看车” 市区五个路口安装雷视一体机

热文:“车看灯”变成“灯看车” 市区五个路口安装雷视一体机

从2022年11月起,驻马店市交警支队先后在市区开源大道与前进大道、开源大道与富强路、开源大道与金山路...
12-19 02:06:10
环球热讯:维生素C热销 多个品牌卖断货 保健品市场迎来新一轮高增长

环球热讯:维生素C热销 多个品牌卖断货 保健品市场迎来新一轮高增长

受各地落实“新十条”优化疫情防控措施的影响,目前很多家庭对于维生素C片、蛋白粉等增强免疫力的保健品...
12-18 15:11:20
焦点报道:国家卫健委:11日新增本土“2171+6455”

焦点报道:国家卫健委:11日新增本土“2171+6455”

据国家卫健委网站12日通报,12月11日0—24时,31个省(自治区、直辖市)和新疆生产建设兵团报告新增确诊病...
12-17 16:10:27
环球短讯!天丝能用洗衣机洗吗 天丝面料怎么洗

环球短讯!天丝能用洗衣机洗吗 天丝面料怎么洗

1、天丝面料是可以机洗的,但是如果放在洗衣机里面进行清洗的话,在清洗时必须要开启弱循环功能,而且清...
12-17 01:47:47
天天简讯:广期所:将于12月22日结算时起开展组合持仓保证金业务

天天简讯:广期所:将于12月22日结算时起开展组合持仓保证金业务

证券时报网讯,广州期货交易所(简称交易所)发布通知,将于2022年12月22日结算时起开展组合持仓保证金业...
12-16 16:48:47
【世界播资讯】河北石家庄:文明守法 安全回家

【世界播资讯】河北石家庄:文明守法 安全回家

12月9日,石家庄市交管局、长安交警大队联合美团配送在省会文化广场开展交通安全宣传主题活动,提高外卖...
12-16 10:51:58
科学脱单,女追男的心理学

科学脱单,女追男的心理学

编者按女生喜欢一个男生的时候,要不要追?当然要。不追,便意味着毫无希望,没有机会。有时,一旦错过...
12-15 23:23:23
中原消费金融网贷逾期25年延迟还款影响征信吗

中原消费金融网贷逾期25年延迟还款影响征信吗

网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天...
12-15 15:47:47
世界热资讯!日本2022年度汉字“战”

世界热资讯!日本2022年度汉字“战”

参考消息网12月13日报道据时事社12月12日报道,日本京都市清水寺住持挥毫书写了今年的年度汉字“战”。...
12-15 10:28:37
聚焦:中国东方航空股份(00670.HK):2023年新增美元汇率套期保值上限不超过31亿美元

聚焦:中国东方航空股份(00670.HK):2023年新增美元汇率套期保值上限不超过31亿美元

格隆汇12月14日丨中国东方航空股份(00670 HK)公告,为对冲美元负债公允价值汇兑风险,防范汇率大幅波动...
12-14 21:48:57
洛阳市第二届童心童路《自闭症专题—爱是永恒》学术论坛圆满落幕

洛阳市第二届童心童路《自闭症专题—爱是永恒》学术论坛圆满落幕

大河网讯10月16日至17日,由洛阳市医学会主办、洛阳新区人民医院承办的洛阳市第二届童心童路《自闭症专...
12-14 15:16:29
【环球速看料】浙江畅通危废电池循环通道 累计收处62万组金额1.2亿元

【环球速看料】浙江畅通危废电池循环通道 累计收处62万组金额1.2亿元

走进浙江省湖州市长兴县画溪街道,“铅蛋”运营平台全景大屏幕实时跳动。杨涛表示,“铅蛋”平台打通了...
12-14 09:14:48
天天热讯:票据日评1213:震荡小跌

天天热讯:票据日评1213:震荡小跌

票据日评1213:震荡小跌
12-13 18:42:01
苏大维格(300331)12月12日主力资金净卖出3582.81万元

苏大维格(300331)12月12日主力资金净卖出3582.81万元

截至2022年12月12日收盘,苏大维格(300331)(300331)报收于22 49元,下跌3 19%,换手率8 47%,成交量17 02万手,成交额3 8
12-13 11:12:37
源杰科技: 源杰科技首次公开发行股票并在科创板上市网上发行申购情况及中签率公告

源杰科技: 源杰科技首次公开发行股票并在科创板上市网上发行申购情况及中签率公告

陕西源杰半导体科技股份有限公司       首次公开发行股票并在科创板上市        网上发...
12-12 23:18:21
新华联文旅积极筹划非公开发行股票

新华联文旅积极筹划非公开发行股票

央行、银保监会、证监会“三箭齐发”,通过增加信贷投放、债券发行、恢复股权融资等措施,支持房企保交...
12-12 15:27:57
致远新能(300985)12月9日主力资金净卖出198.08万元

致远新能(300985)12月9日主力资金净卖出198.08万元

截至2022年12月9日收盘,致远新能(300985)报收于24 26元,上涨3 5%,换手率6 7%,成交量2 44万手,...
12-12 09:01:06
焦点关注:港股异动 | 次新股双财庄(02321)续跌36%、创上市以来新低 暴跌前最高累升3.4倍

焦点关注:港股异动 | 次新股双财庄(02321)续跌36%、创上市以来新低 暴跌前最高累升3.4倍

智通财经APP获悉,继昨日下挫57%后,次新股双财庄早盘再度大跌,触及0 48港元,刷新上市以来低点纪录,...
12-09 11:59:25
当前关注:涨停雷达:物流个股异动 普路通触及涨停

当前关注:涨停雷达:物流个股异动 普路通触及涨停

(原标题:涨停雷达:物流个股异动普路通触及涨停)今日走势:普路通(002769)今日触及涨停板,该股近...
12-08 10:48:51
江河集团(601886)12月6日主力资金净卖出1112.63万元

江河集团(601886)12月6日主力资金净卖出1112.63万元

截至2022年12月6日收盘,江河集团(601886)报收于8 56元,下跌2 62%,换手率0 58%,成交量6 53万手,...
12-07 07:34:00
白酒消费更透明!新国标明确白酒不得用非谷物食用酒精和添加剂

白酒消费更透明!新国标明确白酒不得用非谷物食用酒精和添加剂

在经过一年的缓冲期后,今年6月1日,由市场监管总局、国家标准管理委员会修订发布的《白酒工业术语》及...
06-21 14:53:27
中国铁塔安徽淮北分公司 主动开展专项活动

中国铁塔安徽淮北分公司 主动开展专项活动

为加强公司资产管理,提高一体业务收入准确性,今年以来,中国铁塔安徽淮北分公司主动开展专项活动,对...
03-18 17:43:05
无锡电信“六个一”优化人工成本管理 助力新兴业务发展

无锡电信“六个一”优化人工成本管理 助力新兴业务发展

中国电信江苏无锡分公司持续优化人工成本管理,完善绩效薪酬激励机制,切实提高全口径人力资源使用效率...
03-18 17:43:04
齐晓景:就想为农村做点啥

齐晓景:就想为农村做点啥

  【奋斗青春 无悔抉择】  光明日报记者 陈晨 高平光明网记者 董大正  “这草莓西红柿,脆爽...
10-12 14:06:22
作风之变助推发展之变

作风之变助推发展之变

  作风之变助推发展之变  ——四川剑阁深入推进“我为群众办实事”实践活动  光明日报记者 李晓...
10-12 14:06:22
浙江杭州钱镠墓被盗案开庭宣判 被告人处无期徒刑

浙江杭州钱镠墓被盗案开庭宣判 被告人处无期徒刑

  10月12日上午,浙江省杭州市中级人民法院一审公开开庭审理被告人蒋明磊、李常伟盗掘古墓葬一案并当...
10-12 14:06:22
“90后”女大学生返乡“带货”:我有振兴故乡的责任

“90后”女大学生返乡“带货”:我有振兴故乡的责任

  中新网吉林10月12日电 (记者 石洪宇)面对红叶浸染的山峦,27岁的刘佳宁很快找到创作灵感,成熟的...
10-12 14:06:22

精彩推送