在vue项目中实现单点登录

核心依赖版本,vue3.4.x,vue-router4.3.x。

由于vue项目一般都是前后端分离的,所以这里单点的跳转需要在vue中处理。

一开始考虑将单点跳转做在后端,但那样感觉又将前后端强耦合了起来,所以最终还是决定将单点认证的跳转做在前端。

实现逻辑

在路由守卫中对url进行判断,如果url中包含了需要进行单点登录的query参数,比如type=sso,则向后端请求sso跳转路径,并将跳转路径的回调路径设置为当前的window.location.href。

在sso回调当前url时,会带上对应的code值或者token,我们再在路由守卫中通过code值获取token,或者直接存储token,并根据token获取用户信息,和跳转到目标页面。

说的可能不是很详细,可以结合后边的具体代码来理解。

具体代码

注意这里的代码只是截取,方便理解,所以直接贴到编辑器会报错哈。

javascript 复制代码
router.beforeEach(async (to: ToRouteType, _from, next) => {
  //。。。省略了不相关代码
  let userInfo = storageLocal().getItem<DataInfo>(userKey);//获取本地缓存,看用户是否已经登录
  if (!userInfo) {
    let currentUrl = window.location.href;//存储当前浏览器url。由于vue只识别hash后的参数,所以这里使用window.location.href获取url中的参数
    const match = currentUrl.match(/testCode=([^&#]*)/); //匹配url中的testCode参数,使用&和#作为分隔符
    const testCode = match ? match[1] : null;
    if (testCode) {
      // 5.如果有值,代表是从单点登录回调的url,则根据testCode获取认证信息
      // 6.由于我这边的场景,testCode不是直接的token,所以需要发请求获取token和用户信息,并缓存到本地
      await loginByTestCode(testCode);
    } else if (to.query.type == "sso") {
      //1.如果query参数中包含type=sso,则代表需要进行单点认证。
      //2.替换url中的sso为sse,防止出现死循环跳转
      currentUrl = currentUrl.replace("sso", "sse");
      //3.向后端发请求获取sso认证跳转链接
      const ssoUrl = await getSsoUri(currentUrl);
      //4.直接通过href跳转
      window.location.href = ssoUrl;
    }
  }
  //再次获取用户信息,如果没获取到,则跳转到登录页。获取到用户信息,则跳转到对应的具体信息页
  userInfo = storageLocal().getItem<DataInfo>(userKey);
  //。。。省略了不相关代码
});

最终的过程会是这样的

  1. 浏览器访问http://zcywxy.blog.csdn.net/#/detail?id=xxx\&type=sso
  2. 路由拦截到type=sso,即走代码注释中1-4的逻辑
  3. 跳转到回调url,http://zcywxy.blog.csdn.net/?testCode=xe2dr4_#/detail?id=xxx\&type=sse
  4. 路由拦截到testCode,走注释中5-6的逻辑。

文章对您有帮助的话,可以帮忙点个赞或者关注。

相关推荐
开开心心就好32 分钟前
音频降噪剪辑工具,音量裁剪一键处理
运维·服务器·前端·spring·ocr·音视频·1024程序员节
螺丝钉tina2 小时前
[Playwright] [02]常用命令与调试:Debug UI、Mode和 Trace Viewer
开发语言·javascript·测试工具·ui·自动化
PedroQue992 小时前
0.8.2 新增 backFallback 配置,无 tabbar 页返回无忧
前端·uni-app
淡漠的蓝精灵2 小时前
web.py:一个简单到极致的 Python Web 框架
开发语言·前端·python·其他
开开心心就好3 小时前
竖式除法出题工具,整除余数混合模式
运维·服务器·前端·javascript·ocr·perl·1024程序员节
起个名字费劲死了3 小时前
Halcon学习一:骰子识别
前端·python·学习
大江东去浪淘尽千古风流人物3 小时前
【HexVIO】DSP卸载双目惯性VIO:Hexagon向量化前端与单帧融合调度深度解析
前端·状态模式·slam·dsp·vio·hexagon·移动端加速
এ慕ོ冬℘゜3 小时前
JS 事件循环、宏任务微任务:单线程底层原理 + 执行顺序
开发语言·javascript·ecmascript
其实防守也摸鱼3 小时前
Chrome 扩展安全攻防实录:从攻击面到防御实践
开发语言·前端·网络·chrome·安全·web安全·php
web打印社区3 小时前
Lodop排障总纲-常见报错一张表
开发语言·前端·javascript·chrome·websocket