【后端】单点登录
不定期更新。后期更新代码实战。
目录
- 概念
- 工作原理
- 工作流程
- 实现
- 前端部分
概念
Single Sign-On,简称 SSO
是一种身份验证解决方案,它允许用户只需一次登录,就能访问多个相互信任但独立的应用程序或系统,而无需在每个应用中重复输入用户名和密码。
- 优点
提升用户体验: 用户无需记住多个密码,一次登录,方便快捷。
增强安全性: 用户只需管理一个强密码,降低密码管理负担和被猜测的风险。集中认证也便于实施多因素认证(MFA)。
简化管理: IT 部门可以集中管理用户身份和访问权限,减少密码重置请求。
提高工作效率: 减少重复登录的时间。 - 缺点
单点故障(Single Point of Failure): 如果 SSO 认证中心出现故障,所有依赖它的系统都将无法登录。
安全风险集中: 一旦 SSO 系统被攻破,攻击者可能获得对所有关联系统的访问权限。
实现复杂性: 建立和维护 SSO 系统可能涉及复杂的协议(如 OAuth 2.0, OpenID Connect, SAML)和架构设计。
兼容性问题: 并非所有旧的应用程序都能轻松集成 SSO。 - 常见的 SSO 协议和标准包括:SAML、OAuth 2.0 / OpenID Connect (OIDC)、Kerberos 等。
工作原理
SSO 的实现通常涉及一个独立的认证中心(Identity Provider, IdP)和多个服务提供商(Service Provider, SP)。
- 认证中心(IdP):
这是唯一一个接收用户用户名和密码的地方。它负责对用户进行身份验证。
认证成功后,它会向用户颁发一个认证令牌(Token),表明该用户已通过验证。 - 服务提供商(SP):
这些是用户需要访问的各个应用程序或系统。
不直接处理用户的用户名和密码。它们信任认证中心颁发的令牌token。
工作流程
- 首次访问: 用户尝试访问某个受 SSO 保护的应用(服务提供商 SP1)。
- 重定向至认证中心: SP1 检测到用户未登录,将其重定向到独立的认证中心(IdP)的登录页面。
- 用户登录: 用户在认证中心输入用户名和密码进行登录。
- 颁发令牌: 认证中心验证用户凭据。如果验证成功,它会生成一个安全的认证令牌(如 Session Token、SAML 断言、OAuth/OIDC Token 等),并将用户重定向回 SP1,通常会携带这个令牌或获取令牌的方式。
- SP1 验证并授权: SP1 接收到令牌后,会向认证中心验证令牌的有效性。验证通过后,SP1 认为用户已登录,并允许用户访问其资源。同时,浏览器会将这个令牌(通常通过 Cookie 或 localStorage)存储在用户本地。
- 访问其他应用: 用户接着访问另一个受 SSO 保护的应用(SP2)。
- 自动登录: SP2 检测到用户未登录,同样会重定向到认证中心。但此时,由于浏览器中已经有之前认证中心颁发的有效令牌,认证中心识别到用户已登录,无需再次输入凭据,直接向 SP2 颁发新的或验证旧的令牌。SP2 验证令牌后,也允许用户访问。
关键: 用户只需在认证中心登录一次,后续访问所有关联应用时,都是通过认证中心识别并传递认证状态,从而实现无缝登录。
实现
- 认证中心 (Identity Provider, IdP) 的搭建:
用户凭据的存储、验证和管理。
安全令牌的生成、分发和校验(例如 Session ID、JWT、SAML 断言)。
处理认证协议的逻辑(OAuth 2.0, OpenID Connect, SAML)。
管理用户会话状态。 - 服务提供商 (Service Provider, SP) 的集成:
各个应用(SP)需要与认证中心进行通信,以验证接收到的令牌。
这涉及到后端服务对令牌解析、验证签名、检查过期时间、以及根据令牌中的用户身份信息来建立应用内部的用户会话。
处理重定向和回调 URL 的逻辑。
前端部分
前端负责用户界面的展示、重定向、以及与后端认证服务的交互。 它是用户与 SSO 系统进行互动和体验的部分。
- 重定向处理:
当用户未登录时,前端应用会(通常由后端指导)将用户重定向到认证中心的登录页面。
认证成功后,认证中心会将用户重定向回前端应用,此时前端需要能够接收并处理认证中心传递回来的令牌(通常在webStorage 或 HttpOnly 的 Cookie 中)。
前端在接收到令牌后,会将其传递给自己的后端服务进行验证和会话建立。 - 认证状态管理:
前端需要知道当前用户的登录状态。
在某些实现中,前端可能需要存储和管理一些轻量级的认证信息(如 Access Token),并在后续请求中将其添加到 Authorization 头中发送给后端 API。
处理因令牌过期而导致的重新认证流程。 - 用户界面:
显示登录页面(如果认证中心是独立的前端页面)。
处理登录表单的提交。 - 注意安全性
全程使用 HTTPS: 这是最基本的安全措施,加密所有网络传输,防止 Token 在传输过程中被截获。
定期更新/刷新 Token: 即使 Token 被窃取,其有效时间越短,造成的损害越小。
在服务端进行校验: 所有的 Token 都必须在后端严格校验其有效性、签名和过期时间。
注销时清除 Token: 用户登出时,应清除所有客户端存储的 Token。
防御 XSS 和 CSRF 攻击: 这是 Web 安全的基石,无论 Token 放在哪里,都必须全面考虑。