实现SSO基于Redis的框架(sso实现框架redis)
SSO(Single Sign On), 即单点登录,是在多个系统中使用同一用户凭证,以实现在多个应用系统之间的无缝切换登录的一种技术,也即一次登录认证,在多个系统中无须重复认证,而可保证用户的安全性和方便性。实现 SSO 往往需要一些中间件组件,比如 Redis,可以保存登录状态和共享会话等,下面就介绍基于 Redis 的框架实现SSO方案。
可在单点登录系统中使用一个分布式缓存系统,如 Redis,以存储用户信息和会话信息。在用户使用用户名/密码成功登录后,将会在单点登录系统中生成特定的会话 Token 并存入 Redis 缓存,Token 会使用一定的存储格式,如userId,sessionId等,其中userId代表用户身份信息,sessionId 代表session 值,结构如下图所示:
![avatar](../imgs/sso.png)
这样,用户通过单点登录后,就会自动生成一个 token 存入 Redis 中,并且在登录过程中服务器会返回此 token 值给客户端进行保存,这样当客户端发起任何和服务器交互的请求时,就会将 token 作为参数带到服务器端,此时服务器端只要拿着 token 去 redis 缓存中查询,就可以获取用户的身份信息,如 userid 和 sessionid,用于向用户提供服务。
在传统的基于 Cookie 的共享会话方案中,SSO 的实现原理大致相同,都是在登录时生成一个token,并将其写入 Cookie 中发回给客户端,之后每次客户端发起请求时都会附带上 Cookie 值携带,服务器端拿着 Cookie 值从 Redis 中查找, 以此来判断客户端是否登录,是否有访问权限等。
基于 Redis 的 SSO 框架只需要在单点登录系统中增加一个 Redis 缓存层即可,这可以大大简化 SSO 的实现,使得在多应用之间进行跨域会话管理、权限管理等变得容易,而且 Redis 的架构模型也使得在性能、可靠性、扩展性等方面呈现出优势。
## 代码实现
“`javascript
// 定义一个分布式缓存系统,如 Redis,以存储用户信息和会话信息
const Redis = require(‘redis’);
// 打开连接
const client = Redis.createClient();
// 监听 Redis 的连接事件
client.on(‘connect’, function() {
console.log(‘Redis client connected’);
});
// 客户端登录成功时,生成会话 Token,这里以用户id和sessionId来作为 Token
client.set(‘userId’, ‘123456’);
client.set(‘sessionId’, ‘798313’);
// 获取Token
let Token = `userId:${userId},sessionId:${sessionId}`;
//将 Token 值写入 Redis 缓存中
client.set(‘token’, Token);
// 校验客户端token
client.get(‘token’, function(err, reply) {
if (err) {
console.error(err);
}
let token = reply;
if (token) {
// token 有值时,获取userId和sessionId
let [ userId, sessionId] = token.split(‘,’);
console.log(userId);
console.log(sessionId);
} else {
console.log(‘无效的token’);
}
});
// 断开连接
client.quit();