当前位置:首页 > VUE

vue 实现单点登录

2026-01-14 01:51:11VUE

Vue 实现单点登录的方法

单点登录(SSO)允许用户通过一次登录访问多个相关但独立的系统。以下是基于 Vue 的实现方案:

使用 OAuth2.0/OpenID Connect 协议

  1. 集成认证库
    安装 oidc-clientvue-oidc-client 库,用于处理 OAuth2.0/OpenID Connect 流程。

    npm install oidc-client
  2. 配置认证参数
    在 Vue 项目中创建认证配置文件(如 auth.js),设置授权服务器地址、客户端 ID 等参数。

    import { UserManager } from 'oidc-client';
    const config = {
      authority: 'https://sso.example.com',
      client_id: 'vue-client',
      redirect_uri: 'http://localhost:8080/callback',
      response_type: 'code',
      scope: 'openid profile'
    };
    export const userManager = new UserManager(config);
  3. 登录与回调处理
    在登录页面触发 signinRedirect,在回调页面通过 signinRedirectCallback 获取令牌。

    // 登录触发
    userManager.signinRedirect();
    
    // 回调处理(通常在路由的 callback 页面)
    userManager.signinRedirectCallback().then(user => {
      localStorage.setItem('token', user.access_token);
    });
  4. 路由守卫验证
    使用 Vue Router 的全局前置守卫检查用户是否已认证。

    vue 实现单点登录

    router.beforeEach((to, from, next) => {
      if (to.meta.requiresAuth && !localStorage.getItem('token')) {
        next('/login');
      } else {
        next();
      }
    });

基于 Token 的跨域方案

  1. 共享 Token 存储
    主域名下登录后,将 Token 存储在根域名 Cookie 或 localStorage 中,子应用通过读取共享 Token 实现自动登录。

    // 主应用设置 Cookie(根域名)
    document.cookie = `token=${token}; domain=.example.com; path=/`;
  2. iframe 跨域通信
    使用 postMessage 在子应用 iframe 中传递 Token。

    // 主应用发送 Token
    window.frames['subapp'].postMessage({ token: 'xxx' }, 'https://subapp.example.com');
    
    // 子应用监听消息
    window.addEventListener('message', (event) => {
      if (event.origin === 'https://mainapp.example.com') {
        localStorage.setItem('token', event.data.token);
      }
    });

使用 CAS(Central Authentication Service)

  1. 重定向到 CAS 服务器
    在未登录时跳转至 CAS 登录页,携带当前 Vue 应用的回调地址。

    vue 实现单点登录

    const casLoginUrl = `https://cas.example.com/login?service=${encodeURIComponent(window.location.href)}`;
    window.location.href = casLoginUrl;
  2. 验证 Ticket
    回调到 Vue 应用时,解析 URL 中的 ticket 参数,向 CAS 服务器验证有效性。

    // 解析 URL 参数
    const ticket = new URLSearchParams(window.location.search).get('ticket');
    if (ticket) {
      axios.get(`https://cas.example.com/validate?ticket=${ticket}`)
        .then(response => {
          if (response.data.valid) {
            localStorage.setItem('token', response.data.token);
          }
        });
    }

注意事项

  • Token 安全性
    避免在客户端存储敏感信息,优先使用 HttpOnly Cookie 或短期有效的 JWT。

  • 跨域限制
    确保各子系统域名在主域名下(如 app1.example.comapp2.example.com),或配置 CORS 策略。

  • 注销同步
    实现全局注销时,需通知所有子应用清理本地状态。可通过广播事件或调用各应用的注销 API。

以上方案可根据实际场景组合使用,例如 OAuth2.0 + 跨域 Token 共享。核心流程均为通过中央认证服务验证身份,并在客户端间安全传递认证状态。

标签: 单点vue
分享给朋友:

相关文章

vue实现自定义登录

vue实现自定义登录

实现自定义登录的基本步骤 在Vue中实现自定义登录功能通常需要结合前端和后端技术。以下是一个基本的实现流程: 创建登录表单组件 使用Vue的单文件组件创建一个登录表单,包含用户名和密码输入框以及提交…

vue实现autocomplete

vue实现autocomplete

Vue 实现 Autocomplete 功能 Vue 中实现 Autocomplete(自动完成)功能可以通过自定义组件或使用现有库完成。以下是几种常见方法: 方法一:使用 Vue 原生实现 创建…

vue实现slider

vue实现slider

Vue 实现 Slider 组件 使用 Vue 实现 Slider 组件可以通过原生开发或借助第三方库。以下是两种常见方法: 原生实现 Slider 创建一个基础的 Slider 组件,通过 v-m…

vue实现公告

vue实现公告

Vue 实现公告功能的方法 公告功能通常需要实现滚动展示、自动切换或固定显示的效果。以下是几种常见的实现方式: 使用 marquee 标签实现滚动公告 <template> <…

vue实现键盘

vue实现键盘

Vue 实现键盘功能 在Vue中实现键盘功能通常涉及监听键盘事件、处理输入以及渲染虚拟键盘界面。以下是几种常见的实现方式: 监听键盘事件 通过@keydown或@keyup指令监听键盘事件,适用于需…

vue 实现列表

vue 实现列表

Vue 实现列表的方法 在 Vue 中实现列表通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 指令遍历数组,渲染列表项。ite…