基于OAuth 2.0實現(xiàn)單點登錄(SSO)的核心流程
1. 授權(quán)碼模式流程
OAuth 2.0的==?授權(quán)碼模式(Authorization Code Grant)?==是實現(xiàn)SSO的推薦方案,流程如下:
1.1 用戶訪問客戶端應(yīng)用
用戶首次訪問客戶端A(如門戶網(wǎng)站),客戶端檢測無有效令牌,將用戶重定向至==?認證服務(wù)器?==的授權(quán)端點,攜帶以下參數(shù):
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:請求授權(quán)碼。
state:防止CSRF攻擊的隨機值
1.2 用戶登錄與授權(quán)
用戶在認證服務(wù)器頁面輸入憑證完成登錄。
認證服務(wù)器驗證身份后,詢問用戶是否授權(quán)客戶端A訪問其資源(如用戶信息)。
1.3 生成授權(quán)碼
用戶同意授權(quán)后,認證服務(wù)器生成一次性授權(quán)碼(Authorization Code),并通過重定向返回給客戶端A:
https://client-a.com/callback?code=AUTH_CODE_123&state=random_string
授權(quán)碼有效期通常為2-10分鐘,需客戶端快速處理。
1.4 客戶端換取訪問令牌
客戶端A使用授權(quán)碼向認證服務(wù)器的令牌端點請求訪問令牌(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
認證服務(wù)器驗證授權(quán)碼和客戶端憑證,返回訪問令牌和刷新令牌(Refresh Token)。
1.5 訪問受保護資源
客戶端A使用訪問令牌向資源服務(wù)器請求用戶數(shù)據(jù)(如用戶ID、角色):
GET /userinfo HTTP/1.1
Authorization: Bearer ACCESS_TOKEN_XYZ
資源服務(wù)器驗證令牌有效性后返回數(shù)據(jù),完成用戶登錄。
跨應(yīng)用單點登錄
用戶訪問另一客戶端B時,流程如下:
2.1 客戶端B重定向至認證服務(wù)器
客戶端B檢測無有效令牌,重定向至認證服務(wù)器(攜帶client_id=CLIENT_B_ID)。
2.2 認證服務(wù)器檢查會話狀態(tài)
若用戶已通過客戶端A登錄且會話有效(如存在認證服務(wù)器的Cookie),直接生成新授權(quán)碼,無需重復(fù)登錄。
客戶端B重復(fù)步驟1.3-1.5,獲取訪問令牌并完成登錄。安全增強與關(guān)鍵機制
3.1 令牌管理
短期訪問令牌:有效期短(如1小時),降低泄露風(fēng)險。
刷新令牌:長期有效(如7天),用于獲取新訪問令牌,需安全存儲(如HTTP-only Cookie)。
3.2 單點登出(可選)
調(diào)用認證服務(wù)器的令牌撤銷端點,使令牌失效。
清除所有客戶端和認證服務(wù)器的會話Cookie。
3.3 JWT令牌(可選)
使用JWT作為訪問令牌,包含用戶信息(如sub、roles),減少資源服務(wù)器查詢開銷。
需簽名驗證和有效期檢查。