单点登录(SSO)详解
单点登录(Single Sign-On,SSO)是一种用户认证过程,它允许用户通过一次登录访问多个系统或应用程序,而无需在每个系统中重复输入用户名和密码。SSO 的主要目标是提高用户体验,降低密码管理的复杂性,提高安全性。本文将详细解析 SSO 的工作原理,并提供简单的代码示例。
SSO 的工作原理
SSO 的基本原理是使用一个认证中心(Identity Provider,IdP)来管理用户的认证。当用户访问需要登录的应用程序时,系统会检查用户是否已经通过认证。如果用户未认证,系统会将用户重定向到认证中心,用户在此输入凭据(如用户名和密码)。认证中心验证用户信息后,生成一个令牌(Token)并重定向回原应用,这时用户可以访问相关资源。
SSO 流程简述
- 用户访问某个受保护的应用(Service Provider,SP)。
- 应用检查用户是否已登录,如果未登录,重定向用户到认证中心(IdP)。
- 用户在认证中心进行身份验证后,IdP 生成令牌并重定向回应用。
- 应用验证令牌,确认用户身份,通过后允许用户访问。
SSO 实现技术
实现 SSO 的技术有很多,例如基于 OAuth2、OpenID Connect、SAML 等标准协议。本文将简单讨论基于 OAuth2 的 SSO 实现。
示例代码
为简化代码示例,我们以 Node.js 和 Express 框架为例:
1. 创建认证中心(IdP)
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const PORT = 3000;
// 密钥用于签署 JWT
const SECRET_KEY = 'your_secret_key';
// 模拟用户数据库
const users = {
'user1': 'password1',
'user2': 'password2',
};
// 登录路由
app.post('/login', (req, res) => {
const { username, password } = req.body;
// 检查用户凭证
if (users[username] && users[username] === password) {
// 生成 JWT
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
return res.json({ token });
}
return res.status(401).send('认证失败');
});
// 启动认证中心服务
app.listen(PORT, () => {
console.log(`认证中心运行在 http://localhost:${PORT}`);
});
2. 创建服务提供者(SP)
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const PORT = 4000;
const SECRET_KEY = 'your_secret_key';
// 中间件:验证 JWT
const verifyToken = (req, res, next) => {
const token = req.headers['authorization'];
if (!token) {
return res.status(403).send('没有提供令牌');
}
jwt.verify(token, SECRET_KEY, (err, decoded) => {
if (err) {
return res.status(401).send('无效的令牌');
}
req.user = decoded;
next();
});
};
// 受保护的路由
app.get('/protected', verifyToken, (req, res) => {
res.send(`欢迎 ${req.user.username},这是受保护的资源。`);
});
// 启动服务提供者
app.listen(PORT, () => {
console.log(`服务提供者运行在 http://localhost:${PORT}`);
});
3. 测试 SSO 功能
- 启动认证中心和服务提供者。
- 使用 Postman 或者其他工具向认证中心的
/login
接口发起 POST 请求,传递用户名和密码。 - 获取返回的 JWT 令牌,并在请求服务提供者的
/protected
接口时将令牌放入 Authorization 头中。
小结
单点登录(SSO)通过集中管理用户认证,提高了用户体验和安全性。在多个应用间共享认证信息,用户只需登录一次即可访问所有系统。虽然SAML、OAuth和OpenID Connect等标准为 SSO 提供了不同的实现方式,本文通过简单的 Node.js 示例展示了如何构建一个基本的 SSO 认证中心与服务提供者。希望本文能够帮助您理解 SSO 的基本概念和实现方式。