基于OAuth 2.0实现单点登录(SSO)的核心流程
1. 授权码模式流程
OAuth 2.0的==授权码模式(Authorization Code Grant)==是实现SSO的推荐方案,流程如下:
1.1 用户访问客户端应用
用户首次访问客户端A(如门户网站),客户端检测无有效令牌,将用户重定向至==认证服务器==的授权端点,携带以下参数:
https://auth-server.com/oauth/authorize?
response_type=code&
client_id=CLIENT_A_ID&
redirect_uri=https://client-a.com/callback&
scope=openid profile&
state=random_string
response_type=code:请求授权码。
state:防止CSRF攻击的随机值
1.2 用户登录与授权
用户在认证服务器页面输入凭证完成登录。
认证服务器验证身份后,询问用户是否授权客户端A访问其资源(如用户信息)。
1.3 生成授权码
用户同意授权后,认证服务器生成一次性授权码(Authorization Code),并通过重定向返回给客户端A:
https://client-a.com/callback?code=AUTH_CODE_123&state=random_string
授权码有效期通常为2-10分钟,需客户端快速处理。
1.4 客户端换取访问令牌
客户端A使用授权码向认证服务器的令牌端点请求访问令牌(Access Token):
POST /oauth/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
code=AUTH_CODE_123&
redirect_uri=https://client-a.com/callback&
client_id=CLIENT_A_ID&
client_secret=CLIENT_A_SECRET
认证服务器验证授权码和客户端凭证,返回访问令牌和刷新令牌(Refresh Token)。
1.5 访问受保护资源
客户端A使用访问令牌向资源服务器请求用户数据(如用户ID、角色):
GET /userinfo HTTP/1.1
Authorization: Bearer ACCESS_TOKEN_XYZ
资源服务器验证令牌有效性后返回数据,完成用户登录。
跨应用单点登录
用户访问另一客户端B时,流程如下:
2.1 客户端B重定向至认证服务器
客户端B检测无有效令牌,重定向至认证服务器(携带client_id=CLIENT_B_ID)。
2.2 认证服务器检查会话状态
若用户已通过客户端A登录且会话有效(如存在认证服务器的Cookie),直接生成新授权码,无需重复登录。
客户端B重复步骤1.3-1.5,获取访问令牌并完成登录。安全增强与关键机制
3.1 令牌管理
短期访问令牌:有效期短(如1小时),降低泄露风险。
刷新令牌:长期有效(如7天),用于获取新访问令牌,需安全存储(如HTTP-only Cookie)。
3.2 单点登出(可选)
调用认证服务器的令牌撤销端点,使令牌失效。
清除所有客户端和认证服务器的会话Cookie。
3.3 JWT令牌(可选)
使用JWT作为访问令牌,包含用户信息(如sub、roles),减少资源服务器查询开销。
需签名验证和有效期检查。