OAuth 2.0实现单点登录

基于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
资源服务器验证令牌有效性后返回数据,完成用户登录。

  1. 跨应用单点登录
    用户访问另一客户端B时,流程如下:
    2.1 客户端B重定向至认证服务器
    客户端B检测无有效令牌,重定向至认证服务器(携带client_id=CLIENT_B_ID)。
    2.2 认证服务器检查会话状态
    若用户已通过客户端A登录且会话有效(如存在认证服务器的Cookie),直接生成新授权码,无需重复登录。
    客户端B重复步骤1.3-1.5,获取访问令牌并完成登录。

  2. 安全增强与关键机制
    3.1 令牌管理
    短期访问令牌:有效期短(如1小时),降低泄露风险。
    刷新令牌:长期有效(如7天),用于获取新访问令牌,需安全存储(如HTTP-only Cookie)。
    3.2 单点登出(可选)
    调用认证服务器的令牌撤销端点,使令牌失效。
    清除所有客户端和认证服务器的会话Cookie。
    3.3 JWT令牌(可选)
    使用JWT作为访问令牌,包含用户信息(如sub、roles),减少资源服务器查询开销。
    需签名验证和有效期检查。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容