当前位置:首页 > VUE

vue实现单点

2026-01-12 09:11:04VUE

Vue 实现单点登录(SSO)方案

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

基于 OAuth2/OpenID Connect 的实现

使用 oidc-client-js 库处理认证流程:

import { UserManager, WebStorageStateStore } from 'oidc-client'

const config = {
  authority: 'https://sso-provider.com',
  client_id: 'vue-app-client-id',
  redirect_uri: `${window.location.origin}/callback`,
  response_type: 'code',
  scope: 'openid profile',
  userStore: new WebStorageStateStore({ store: localStorage })
}

const userManager = new UserManager(config)

// 登录跳转
userManager.signinRedirect()

// 处理回调
userManager.signinRedirectCallback().then(user => {
  console.log('登录成功:', user.profile)
})

基于 JWT 的跨域方案

  1. 主域设置共享 Cookie

    vue实现单点

    axios.post('https://auth-server.com/login', credentials, {
    withCredentials: true // 允许跨域带cookie
    })
  2. 子应用验证 Token

    // 拦截器添加Token
    axios.interceptors.request.use(config => {
    const token = localStorage.getItem('sso_token')
    if (token) config.headers.Authorization = `Bearer ${token}`
    return config
    })

基于 iframe 的父窗口通信

主应用维护登录状态,子应用通过 postMessage 同步:

vue实现单点

// 主应用
window.addEventListener('message', event => {
  if (event.data.type === 'SSO_CHECK') {
    event.source.postMessage({
      type: 'SSO_STATUS',
      loggedIn: store.state.user.isAuthenticated
    }, event.origin)
  }
})

// 子应用
const checkLogin = () => {
  window.parent.postMessage({ type: 'SSO_CHECK' }, '*')
  window.addEventListener('message', event => {
    if (event.data.type === 'SSO_STATUS') {
      console.log('登录状态:', event.data.loggedIn)
    }
  })
}

服务端渲染(SSR)特殊处理

Nuxt.js 中需注意服务端 token 传递:

// plugins/sso.js
export default async ({ app, req }) => {
  if (process.server) {
    const token = req.headers.cookie?.match(/sso_token=([^;]+)/)?.[1]
    if (token) app.$axios.setToken(token, 'Bearer')
  }
}

安全注意事项

  • 始终使用 HTTPS
  • 设置合理的 token 过期时间
  • 实现 CSRF 防护
  • 敏感操作需二次验证
  • 定期轮换加密密钥

调试技巧

开发时可使用代理解决跨域:

// vue.config.js
module.exports = {
  devServer: {
    proxy: {
      '/auth': {
        target: 'https://sso-server.com',
        changeOrigin: true
      }
    }
  }
}

以上方案可根据实际业务需求组合使用,建议优先采用标准协议如 OAuth2。实施时需确保各系统间的信任域配置正确,并做好会话管理。

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

相关文章

vue实现打字机

vue实现打字机

Vue实现打字机效果 在Vue中实现打字机效果可以通过动态更新文本内容并添加延迟来实现。以下是几种常见的实现方法: 使用setInterval实现 <template> <di…

vue全选实现

vue全选实现

Vue 全选实现方法 在 Vue 中实现全选功能通常涉及数据绑定和事件处理。以下是几种常见的实现方式: 基础实现方式 <template> <div> <i…

vue实现动态

vue实现动态

Vue 实现动态路由的方法 在 Vue 中实现动态路由通常涉及以下几个关键步骤: 使用 Vue Router 的动态路由匹配 通过 Vue Router 的 :param 语法可以实现动态路由匹配。…

vue实现换行

vue实现换行

Vue 中实现换行的几种方法 在 Vue 中实现换行可以通过多种方式,具体取决于使用场景和需求。以下是常见的几种方法: 使用 HTML 的 <br> 标签 在模板中直接使用 <br…

vue实现甘特图

vue实现甘特图

使用 Vue 实现甘特图 基于开源库(如 vue-ganttastic) 安装依赖库: npm install vue-ganttastic 示例代码: <template> &l…

vue 实现 input focus

vue 实现 input focus

实现 Input Focus 的方法 在 Vue 中实现 input 元素的聚焦可以通过以下几种方式完成。 使用 ref 和 $refs 通过 ref 属性标记 input 元素,然后在 Vue 实…