当前位置:首页 > JavaScript

js实现单点登录

2026-04-04 10:38:24JavaScript

单点登录(SSO)实现原理

单点登录允许用户通过一次身份验证访问多个系统。核心机制是通过中央认证服务器(如Identity Provider, IdP)生成令牌(如JWT),其他系统(Service Provider, SP)验证令牌有效性。

基于JWT的SSO实现步骤

1. 用户登录认证

js实现单点登录

  • 用户访问主系统(IdP)并提交凭证(如用户名/密码)。
  • IdP验证凭证,生成JWT并返回给客户端(通常存储在Cookie或LocalStorage)。
// IdP服务器生成JWT示例(使用jsonwebtoken库)
const jwt = require('jsonwebtoken');
const token = jwt.sign({ userId: '123' }, 'secretKey', { expiresIn: '1h' });

2. 令牌传递与验证

  • 用户访问子系统(SP)时,前端将JWT附加到请求头(如Authorization: Bearer <token>)。
  • SP后端通过公钥或共享密钥验证JWT有效性。
// SP服务器验证JWT示例
const decoded = jwt.verify(token, 'secretKey');
if (decoded.userId) {
  // 认证通过
}

3. 跨域处理(可选)

js实现单点登录

  • 若IdP与SP域名不同,需启用CORS或通过后端代理传递令牌。
  • 使用document.cookie设置SameSite=NoneSecure属性以支持跨域Cookie。

OAuth 2.0集成方案

1. 授权码模式流程

  • 用户访问SP,SP重定向到IdP授权页面。
  • 用户授权后,IdP返回授权码至SP回调地址。
  • SP用授权码向IdP换取访问令牌(Access Token)。
// SP后端换取令牌示例(使用axios)
const axios = require('axios');
const response = await axios.post('https://idp.com/token', {
  code: 'AUTH_CODE',
  client_id: 'SP_CLIENT_ID',
  client_secret: 'SP_SECRET'
});
const accessToken = response.data.access_token;

2. 隐式模式(前端直接获取令牌)

  • 适用于纯前端应用,IdP直接返回令牌至前端(通过URL哈希片段)。
// 前端解析哈希中的令牌
const token = window.location.hash.split('&')[0].split('=')[1];

安全注意事项

  • JWT需设置短期有效期并启用HTTPS。
  • 敏感操作需二次验证(如OTP)。
  • 避免令牌存储在易泄露的位置(如全局变量)。

示例完整流程

  1. 用户登录idp.example.com,获取JWT。
  2. 访问sp1.example.com,前端携带JWT请求API。
  3. SP1验证JWT后返回数据。
  4. 用户访问sp2.example.com时重复步骤2-3。

通过上述方法,可实现无感知的跨系统登录体验。

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

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…