当前位置:首页 > 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
分享给朋友:

相关文章

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…