当前位置:首页>焦点 > 正文

环球关注:使用 IdentityServer 保护 Vue 前端

  • 2022-12-19 08:39:32来源:
前情提要

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

当前最新:南靖县领导调研农村污水治理工作

南靖县领导调研农村污水治理工作

【环球快播报】咸蛋可以用微波炉煮吗 咸蛋能不能用微波炉煮呢

1、带壳的咸蛋直接置于干净的清水中煮熟或蒸熟都是可以的,但是需要注意的是如果是带壳的熟咸鸭蛋是不能放进微波炉里面加热的。2、因为带壳的咸

天天热消息:今日沃柑价格多少一斤(沃柑批发价格)

更详细的情况,一般是20元一份,2克。我们可以在一些小吃街买到这种食物,移植的成活率很高。一个沃根的热量大约是4466卡路里。购买原因。你敢

微速讯:开车撞到老人了怎么处理

我国《刑法》第二百三十四条规定:故意伤害他人身体的,处三年以下有期徒刑、拘役或者管制。犯前款罪,致人重伤的,处三年以上十年以下有期徒

全球热头条丨国家发改委:7399亿元金融工具支持的工程项目全部开工

截至11月底,国家发改委已审批核准106个重大项目、总投资约15万亿元

世界观点:共同承包厂里的活出了工伤如何办

指与用人单位存在劳动关系(包括事实劳动关系)的各种用工形式、各种用工期限的劳动者。】你与单位是承包关系,单位就必须派出相关安全管理人

环球看热讯:南乐:文化科技卫生“三下乡”助力脱贫攻坚

听唱戏、领对联、检查身体、咨询问题……1月10日,虽然天气寒冷,但在南乐县近德固乡彭村的党建中心广场上熙熙攘攘、人声鼎沸、热闹非凡,...

天天热消息:贝壳发布家庭适老化居住报告 呼吁关注“一碗汤的距离”

导读:走廊扶手,卧室床沿的智能声控灯,地板、地砖的防滑设计,卫生间去掉内推门……诸如此类适老化的小微改造,都会降低老人居家生活风险...

看热讯:兆易创新(603986)12月14日主力资金净卖出3.27亿元

截至2022年12月14日收盘,兆易创新(603986)报收于104 5元,下跌3 08%,换手率3 86%,成交量25 57万手,成交额27 69亿元。12月

今日要闻!鑫铂股份(003038.SZ):1415.73万股限售股12月16日解禁 占比9.59%

格隆汇12月14日丨鑫铂股份公布,公司此次解除限售股份股东共有15名,合计解除限售的股份数量为1415 7303万股,占公司总股本的9 59%;上市流通

天天播报:西上海:如有重大事项,公司将依法依规进行信息披露

西上海(605151)12月14日在投资者关系平台上答复了投资者关心的问题。投资者:董秘你好,请问公司有考虑引进战略投资者进行资产重组的计划吗?西

世界要闻:12月13日基金净值:富国中证国有企业改革指数(LOF)A最新净值0.986,跌0.2%

12月13日,富国中证国有企业改革指数(LOF)A最新单位净值为0 986元,累计净值为1 313元,较前一交易日下跌0 2%。历史数据显示该基金近1个月上涨

天天信息:武进不锈(603878)12月13日主力资金净卖出190.62万元

截至2022年12月13日收盘,武进不锈(603878)报收于11 18元,下跌5 57%,换手率1 97%,成交量7 9万手,成交额9006 13万元。12月

全球最新:2022年过失撞死人怎么判多久

此处所谓“发生重大事故”,是指具有以下情形之一的:(1)死亡一人或者重伤三人以上,负事故全部或者主要责任的;(2)死亡三人以上,负事...

【全球新要闻】黄瓜做泡菜方法 黄瓜泡菜怎么做

1、主料:黄瓜6根;苹果1 4个;姜1块;蒜头3个;调料:辣椒粉2大匙;盐2小匙;鱼露1大匙。2、黄瓜洗净,去两端,稍刨去些皮,切成滚刀块,加盐

天天最资讯丨华联综超: 第八届董事会第二次会议决议公告

证券代码:600361      证券简称:华联综超     公告编号:2022-089               创新新材料科技股份有限公司 

当前快播:小崧股份(002723.SZ):中标8959.73万元上饶高新区标准厂房建设项目

格隆汇12月8日丨小崧股份公布,公司全资子公司国海建设有限公司近日收到上饶市广丰投融资有限责任公司送达的《中标通知书》,确认国海建设有限

天天热文:南召南河店镇:巧用“三强三重”法 推进脱贫村“五星创建”

自“五星”支部创建工作开展以来,南召县南河店镇把开展“五星”支部创建、深化党建统领基层治理作为强基固本的重要举措,作为提升镇村干部...

环球快报:熵基科技董秘回复:公司是一家以生物识别为核心技术

熵基科技(301330)12月06日在投资者关系平台上答复了投资者关心的问题。投资者:尊敬的董秘,您好。请问贵司有数据采集、数据确权、数据存储方

襄阳二季度20个工业园区完成114项任务 完成率达76%!

8月4日,记者从市经信局获悉,为提高工业园区承载能力,更好地促进优质生产要素集约节约和产业集中集聚,加快先进制造业产业链建设步伐,为

全力保障能源供应 迎峰度夏河北省电力供需将处于“紧平衡”

6月20日17时,河北省气象台继续发布高温红色预警信号,预计21日白天,保定、廊坊及以南地区最高气温可达37℃以上,其中保定东部、石家庄、

“莆田鞋”集体商标注册成功!中小企业需升级品牌化新思路

今年3月,莆田鞋集体商标获得国家知识产权局批准成功注册。5月,莆田鞋业出台莆田鞋集体商标管理办法。莆田鞋作为一个集体商标,由莆田名品

年报“难产”7家公司被立案 年报披露不能患上“拖延症”

年报季早已结束,部分公司却患上拖延症,迄今仍未披露2021年年报。近期,证监会对7家未在法定期限内披露年报的上市公司立案,认定为涉嫌信

民企高校携手促就业 南京市工商联助企揽才

为深入贯彻落实教育部与全国工商联携手促进就业行动要求,进一步助力高校毕业生更高质量就业,推进南京经济社会发展,日前,南京市工商联走

起拍价7.85亿元!恒泰地产1.8亿股徽商银行股份即将开拍

6月20日,资本邦了解到,阿里司法拍卖平台信息显示,安徽省恒泰房地产开发有限责任公司所持徽商银行1 8亿股股份即将于6月27日上午10点开拍

乐享集团收到69.16%股东承诺函 自愿延长9个月期限

6月20日,资本邦了解到,乐享集团(06988 HK)公告,近日公司收到作出该公告所载初始锁定承诺的公司各股东发出的承诺函(「承诺函」)。鉴于对

反弹明显!6只“固收+”基金近1个月涨幅超10%

6月20日,资本邦了解到,近期A股市场上涨明显,部分个股录得较大的涨幅,相关固收+基金也反弹明显。Choice数据显示,截至6月17日,在1213只

达达快送发布618战报:配送单量连续两日突破1000万

6月20日,资本邦了解到,达达集团(DADA US)旗下本地即时配送平台达达快送发布618战报。6月18、19日,达达快送日配送单量创历史新高且连续两

猜您喜欢

    Copyright ©  2015-2022 东方服装网版权所有  备案号:沪ICP备2020036824号-8   联系邮箱:562 66 29@qq.com