我使用此代碼https://github.com/gdongus/spring-boot-oauth-jwt-example和一切工作完美,但我不知道如何實現註銷功能。有人可以給我建議嗎?謝謝。彈簧引導智威湯遜登出
8
A
回答
7
客戶端註銷很簡單,只需放棄您擁有的令牌。爲了提供服務器端註銷功能,您的應用程序必須知道當前已通過身份驗證的客戶端,換句話說,現有令牌。基於令牌的身份驗證的「內置」問題是,如果令牌被髮布,它將有效直至失效並且沒有「遠程失效」解決方案。您唯一的機會是避免使用您不再信任的令牌訪問請求。
所以你必須記住一個名爲token store的容器中的每個已發佈的令牌。
TokenStore
接口的一些實現可以在內存中工作,也可以在數據庫中工作(JdbcTokenStore
)。舉個簡單的例子,InMemoryTokenStore
就足夠了。
要使用它,必須按如下所示創建和配置令牌存儲。
添加到您的AuthorizationServerConfiguration
:
@Bean
public InMemoryTokenStore tokenStore() {
return new InMemoryTokenStore();
}
而在AuthorizationServerEndpointsConfigurer
使用它:
@Override
public void configure(AuthorizationServerEndpointsConfigurer configurer) throws Exception {
configurer.authenticationManager(authenticationManager);
configurer.userDetailsService(userDetailsService);
configurer.accessTokenConverter(accessTokenConverter());
configurer.tokenStore(tokenStore());
}
也將它添加到您的ResourceServerConfiguration
:
@Autowired
private InMemoryTokenStore inMemoryTokenStore;
...
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("resource").tokenStore(inMemoryTokenStore);
}
這是幾乎所有的。現在像你需要它,也許有一個特殊的端點,在你只有得到令牌(S),你可以實現你的註銷功能,並從令牌存儲與刪除:
inMemoryTokenStore.removeAccessToken(accessToken);
inMemoryTokenStore.removeRefreshToken(refreshToken);
注意還去除刷新令牌,否則(如果只有訪問令牌被刪除),客戶端可以通過刷新令牌獲得新的令牌。
這是根據你的測試,以驗證它的工作測試用例:
@Test
public void getUserWithValidAuth() throws Exception {
final HttpHeaders headers = getHttpHeader(CLIENT_USER, CLIENT_SECRET);
final HttpEntity<String> request = new HttpEntity<>(headers);
final String tokenUrl = getOAuthTokenUrl(OAUTH_TOKEN_USERNAME, OAUTH_TOKEN_PASSWORD);
final ResponseEntity<Object> response = restTemplate.exchange(tokenUrl, HttpMethod.POST, request, Object.class);
assertTrue("Did not get auth tokens!", response.getStatusCode().is2xxSuccessful());
final Map result = (Map) response.getBody();
final String accessTokenAsString = (String) result.get(ACCESS_TOKEN);
final String refreshTokenAsString = (String) result.get(REFRESH_TOKEN);
final String resourceUrlWithToken = "http://localhost:" + port + "/users?access_token=" + accessTokenAsString;
final ResponseEntity<String> userResponse = restTemplate.exchange(resourceUrlWithToken, HttpMethod.GET, null,
String.class);
assertTrue("Could not request user data!", userResponse.getStatusCode().is2xxSuccessful());
final OAuth2AccessToken accessToken = inMemoryTokenStore.readAccessToken(accessTokenAsString);
final OAuth2RefreshToken refreshToken = inMemoryTokenStore.readRefreshToken(refreshTokenAsString);
inMemoryTokenStore.removeAccessToken(accessToken);
inMemoryTokenStore.removeRefreshToken(refreshToken);
try {
restTemplate.exchange(resourceUrlWithToken, HttpMethod.GET, null, String.class);
fail("Should not get here, expected 401 for request with access token!");
} catch (HttpClientErrorException e) {
// would not be needed with MockMvc
}
final String refreshTokenUrl = REFRESH_TOKEN_URL + refreshTokenAsString;
try {
restTemplate.exchange(refreshTokenUrl, HttpMethod.POST, request, Object.class);
fail("Should not get here, expected 401 for request with refresh token!");
} catch (HttpClientErrorException e) {
// would not be needed with MockMvc
}
}
而且至少只是一個建議,使用MockMvc是一個真棒測試框架,可以很容易地測試REST調用和你可以在使用RestTemplate的同時擺脫障礙和鍋爐板代碼。也許你想試試看。
相關問題
- 1. 智威湯遜
- 2. IdentityServer3和智威湯遜ValidateIssuerSigningKey
- 3. Keycloak智威湯遜一代
- 4. 智威湯遜和Spring Security
- 5. JsonWebTokenError:無法驗證智威湯遜
- 6. 智威湯遜簽署與PHP
- 7. 角 - 智威湯遜刷新令牌
- 8. 角4智威湯遜的localStorage明確
- 9. 智威湯遜與多模式
- 10. 智威湯遜和SAML的區別?
- 11. Facebook驗證和智威湯遜
- 12. 智威湯遜令牌刷新
- 13. 解碼的OpenID id_token - 智威湯遜
- 14. Laravel護照VS智威湯遜
- 15. Android SafetyNet智威湯遜簽名驗證
- 16. 爲智威湯遜生成密鑰?
- 17. 如果智威湯遜被盜?
- 18. 智威湯遜 - 如何計算簽名
- 19. Rails的設計,智威湯遜,如何
- 20. AFNetworking和令牌從Django智威湯遜
- 21. 智威湯遜認證工作流程
- 22. Asp.Net核心,智威湯遜和OpenIdConnectServer
- 23. 智威湯遜+餅乾+ HTTPS + CSRF
- 24. 智威湯遜全球+私密
- 25. Mashape Kong +智威湯遜無效令牌
- 26. 智威湯遜驗證客戶端?
- 27. 智威湯遜(OAuth的?)流量
- 28. angular2,智威湯遜:無提供AuthConfig
- 29. 使用智威湯遜在Owin
- 30. 登錄用戶在智威湯遜在驗證laravel