单点登录(SSO)详解

单点登录(Single Sign-On,SSO)是一种用户认证过程,它允许用户通过一次登录访问多个系统或应用程序,而无需在每个系统中重复输入用户名和密码。SSO 的主要目标是提高用户体验,降低密码管理的复杂性,提高安全性。本文将详细解析 SSO 的工作原理,并提供简单的代码示例。

SSO 的工作原理

SSO 的基本原理是使用一个认证中心(Identity Provider,IdP)来管理用户的认证。当用户访问需要登录的应用程序时,系统会检查用户是否已经通过认证。如果用户未认证,系统会将用户重定向到认证中心,用户在此输入凭据(如用户名和密码)。认证中心验证用户信息后,生成一个令牌(Token)并重定向回原应用,这时用户可以访问相关资源。

SSO 流程简述

  1. 用户访问某个受保护的应用(Service Provider,SP)。
  2. 应用检查用户是否已登录,如果未登录,重定向用户到认证中心(IdP)。
  3. 用户在认证中心进行身份验证后,IdP 生成令牌并重定向回应用。
  4. 应用验证令牌,确认用户身份,通过后允许用户访问。

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 功能

  1. 启动认证中心和服务提供者。
  2. 使用 Postman 或者其他工具向认证中心的 /login 接口发起 POST 请求,传递用户名和密码。
  3. 获取返回的 JWT 令牌,并在请求服务提供者的 /protected 接口时将令牌放入 Authorization 头中。

小结

单点登录(SSO)通过集中管理用户认证,提高了用户体验和安全性。在多个应用间共享认证信息,用户只需登录一次即可访问所有系统。虽然SAML、OAuth和OpenID Connect等标准为 SSO 提供了不同的实现方式,本文通过简单的 Node.js 示例展示了如何构建一个基本的 SSO 认证中心与服务提供者。希望本文能够帮助您理解 SSO 的基本概念和实现方式。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部