問題背景
有同學私信問了這樣的問題,訪問 pig4cloud 的演示環境 查看登錄請求 network 回傳報文如下:
{
"access_token":"16d35799-9cbb-4c23-966d-ab606029a623",
"token_type":"bearer",
"refresh_token":"495dbde5-1bbb-43c9-b06b-ecac50aa5d53",
"expires_in":41000,
"scope":"server"
}
而本地部署運行的時,登錄請求回傳的報文如下:
{
"access_token":"c262afbe-441e-4023-afb4-f88c8a0a7d51",
"token_type":"bearer",
"refresh_token":"ea642d50-5cf5-48ad-9ef9-cb57c9dde00a",
"scope":"server"
}
缺少 expires_in 過期引數,所以客戶端無法知悉何時執行重繪行為,
原始碼剖析
我們來看下 oauth2 的令牌方法機制,如果客戶端 配置的 validitySeconds (令牌有效期) 大于 0 會回傳當前令牌的有效時間 expires_in 引數,
OAuth2AccessToken createAccessToken() {
DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(UUID.randomUUID().toString());
int validitySeconds = getAccessTokenValiditySeconds(authentication.getOAuth2Request());
if (validitySeconds > 0) {
token.setExpiration(new Date(System.currentTimeMillis() + (validitySeconds * 1000L)));
}
token.setRefreshToken(refreshToken);
token.setScope(authentication.getOAuth2Request().getScope());
return accessTokenEnhancer != null ? accessTokenEnhancer.enhance(token, authentication) : token;
}
- tokenStore 去存盤 令牌的時候,若過期引數為 0 或者 小于 0 Expiration 為空,不會設定有效時間也就意味著為永久有效,所以此時不會客戶端回應 expires_in 引數
if (token.getExpiration() != null) {
int seconds = token.getExpiresIn();
conn.expire(accessKey, seconds);
conn.expire(authKey, seconds);
conn.expire(authToAccessKey, seconds);
conn.expire(clientId, seconds);
conn.expire(approvalKey, seconds);
}

永久有效的令牌是否應該回傳 expires_in 引數呢?
我們先來看下oauth2 協議規范
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
"token_type":"bearer",
"expires_in":3600,
"refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk",
"scope":"create"
}
- access_token (必需) 授權服務器發出的訪問令牌
- token_type (必需)這是令牌的型別,通常只是字串“bearer”,
- expires_in (推薦)如果訪問令牌過期過期時間,
- refresh_token(可選)重繪令牌,在訪問令牌過期后,可使用此令牌重繪,
- scope(可選)如果用戶授予的范圍與應用程式請求的范圍相同,則此引數為可選,
此處 expires_in 推薦回傳,無論是有設定有效期限制還是無有效期限制,所以此處 spring security oauth2 的處理并不符合協議規范 emmm ,

專案推薦: Spring Cloud 、Spring Security OAuth2的RBAC權限管理系統 歡迎關注
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/168587.html
標籤:Java
上一篇:一個關于 SQL 別名的面試題
