单点登录(Single Sign-On,简称 SSO)是一种认证机制,允许用户使用一个单一的登录凭证(如用户名和密码)访问多个独立的软件系统或应用程序,而无需在每个系统或应用程序中重复登录。SSO 提高了用户体验和安全性,简化了用户管理。
单点登录的工作原理
- 用户登录:用户在 SSO 认证服务器上进行身份验证,输入用户名和密码。
- 认证服务器验证:SSO 认证服务器验证用户的凭证。如果验证成功,生成一个认证令牌(Token)。
- 牌分发:认证服务器将令牌发送给用户的浏览器。
- 访问应用:用户访问其他受保护的应用程序时,浏览器会自动携带令牌。
- 令牌验证:应用程序接收到令牌后,向 SSO 认证服务器验证令牌的有效性。
- 访问授权:如果令牌有效,应用程序允许用户访问资源。
单点登录的优点
- 用户体验:用户只需登录一次即可访问多个系统,减少了重复登录的麻烦。
- 安全性:集中管理用户认证信息,降低了密码泄露的风险。
- 管理方便:管理员可以集中管理用户的访问权限,简化了用户管理流程。
单点登录的实现方式
- 基于 Cookie 的 SSO:通过共享域名的 Cookie 实现单点登录。
- 基于 Token 的 SSO:使用 JWT(JSON Web Token)等令牌机制实现单点登录。
- 基于 OAuth 的 SSO:使用 OAuth 协议实现单点登录,如 Google、Facebook 登录。
- 基于 SAML 的 SSO:使用 SAML(Security Assertion Markup Language)协议实现单点登录,常用于企业级应用。
示例:基于 JWT 的 SSO
以下是一个基于 JWT 的 SSO 示例:
- 用户登录:
- 用户在 SSO 认证服务器上输入用户名和密码。
- 认证服务器验证用户凭证,生成 JWT 并返回给用户。
- 访问应用:
- 用户访问受保护的应用程序,浏览器携带 JWT。
*应用程序验证 JWT 的有效性,允许用户访问资源。
- 用户访问受保护的应用程序,浏览器携带 JWT。
// 生成 JWT
const jwt = require('jsonwebtoken');
const token = jwt.sign({ userId: 123 }, 'secretKey', { expiresIn: '1h' });
// 验证 JWT
const decoded = jwt.verify(token, 'secretKey');
console.log(decoded.userId); // 123
总结
单点登录(SSO)是一种提高用户体验和安全性的认证机制,允许用户使用一个登录凭证访问多个系统。SSO 可以通过多种方式实现,如基于 Cookie、Token、OAuth 和 SAML 等。通过 SSO,用户只需登录一次即可访问多个应用程序,简化了用户管理流程。