實現Spring OAuth2安全性,並在使用同一用戶登錄時獲得相同的訪問令牌,但從不同的設備登錄。當我從這些設備中的任何一個註銷時(撤銷令牌),其他設備也將被註銷。這是預期的行爲還是我錯過了什麼?希望分享大量的代碼不會有太大的幫助,所以這個問題簡單而簡單。實現Spring OAuth2,從不同設備獲取相同的訪問令牌
2
A
回答
2
的DefaultTokenServices的默認行爲是(基於現有TokenStore實現的行爲)
如果你想每一個設備被賦予不同的現有令牌再利用access_token
然後創建你自己的AuthenticationKeyGenerator
eg在授權過程中發送您的設備ID,並讓您的設備ID處理該設備的access_token
。
1
對於那些誰也面臨同樣的問題可以通過MangEngkus回覆的解決方案的工作,精確的解決方案,你也可以參考這個鏈接Spring OAuth2 Generate Access Token per request to the Token Endpoint
2
(請閱讀org.springframework.security.oauth2.provider.token.DefaultAuthenticationKeyGenerator
碼放在以下解決方案的來龍去脈)
DefaultAuthenticationKeyGenerator
在春天有售。我剛剛創建了一個具有一個擴展名的相同代碼的自定義版本,即從客戶端發送的device_id
,因爲如下從OAuth2Authentication
檢索請求參數;
String deviceId = authentication.getOAuth2Request().getRequestParameters().get("device_id")
,然後放入values
圖(用於最後生成的令牌)。因此,device_id
成爲token
的一部分,從而導致每個設備具有唯一的令牌。
以下是完整的解決方案,其中大部分是DefaultAuthenticationKeyGenerator
除了上面解釋的位。
public class CustomAuthenticationKeyGenerator implements AuthenticationKeyGenerator
{
private static final String CLIENT_ID = "client_id";
private static final String SCOPE = "scope";
private static final String USERNAME = "username";
@Override
public String extractKey(OAuth2Authentication authentication) {
Map<String, String> values = new LinkedHashMap<String, String>();
OAuth2Request authorizationRequest = authentication.getOAuth2Request();
if (!authentication.isClientOnly()) {
values.put(USERNAME, authentication.getName());
}
values.put(CLIENT_ID, authorizationRequest.getClientId());
if (authorizationRequest.getScope() != null) {
values.put(SCOPE, OAuth2Utils.formatParameterList(authorizationRequest.getScope()));
}
String deviceId = authorizationRequest.getRequestParameters().get(CustomHeader.device_id.name());
if(deviceId != null && !deviceId.isEmpty()) {
values.put("device_id", deviceId);
}
MessageDigest digest;
try {
digest = MessageDigest.getInstance("MD5");
}
catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("MD5 algorithm not available. Fatal (should be in the JDK).");
}
try {
byte[] bytes = digest.digest(values.toString().getBytes("UTF-8"));
return String.format("%032x", new BigInteger(1, bytes));
}
catch (UnsupportedEncodingException e) {
throw new IllegalStateException("UTF-8 encoding not available. Fatal (should be in the JDK).");
}
}
}
相關問題
- 1. 設計(OAuth2)訪問令牌
- 2. Python oauth2 - 獲取訪問令牌
- 3. 在OAuth2中獲取訪問令牌
- 4. WinRT - OAuth2獲取訪問令牌
- 5. Spring安全OAuth2 - 驗證訪問令牌
- 6. 在Back4App中獲取不同的設備令牌
- 7. UUID和設備令牌是否相同?
- 8. Iframe。從不同的移動設備獲取相同的iframe點
- 9. 如何通過OAuth2從vKontakte(VK)獲取訪問令牌?
- 10. OAuth2訪問令牌響應
- 11. 在oAuth2中竊取訪問令牌
- 12. ios 7設備令牌對於同一設備不同
- 13. APNS - 獲取設備令牌
- 14. 春季OAuth2訪問令牌在HTTP頭
- 15. 訪問不安全資源時訪問令牌無效oauth2
- 16. 當請求oauth2訪問令牌時獲取無效範圍
- 17. 獲取設備令牌?
- 18. 獲取Android設備令牌
- 19. 如何使用相同的OAuth2令牌訪問Azure圖形和Microsoft Graph?
- 20. 獲取OAuth2刷新令牌
- 21. 所有的Google API都使用相同的oauth2訪問令牌嗎?
- 22. 不同類型的Facebook訪問令牌
- 23. 通過Swift獲取Youtube API的OAuth2訪問令牌
- 24. 不同的Android設備可以訪問相同的SQLite表嗎?
- 25. 設備令牌從一個設備到另一個設備是不同的
- 26. 從聲音雲獲取訪問令牌?
- 27. 從Python Social Auth獲取訪問令牌
- 28. 錯誤獲取的OAuth2訪問令牌:500錯誤
- 29. 無法獲取谷歌分析API的oAuth2訪問令牌
- 30. 如何從設備獲取設備令牌?
嗨MangEngkus,感謝您的回答,我會嘗試這種方法,讓你知道 – Soumyaansh
感謝您MangEngkus解決方案爲我 – Soumyaansh