私はこのコードhttps://github.com/gdongus/spring-boot-oauth-jwt-exampleを使用していますが、すべて正常に動作しますが、ログアウト機能を実装する方法はわかりません。誰かが私に助言を与えることができますか?ありがとうございました。スプリングブートJWTログアウト
答えて
クライアント側のログアウトは単純ですが、所有しているトークンを破棄するだけです。サーバーサイドのログアウト機能を提供するには、アプリケーションは現在認証されているクライアント、つまり既存のトークンを認識している必要があります。トークンベースの認証での "組み込み"の問題は、トークンが公開されている場合、トークンが期限切れになるまで有効であり、「リモート無効化」ソリューションがないことです。唯一の機会は、あなたが信頼していないトークンを持つリクエストへのアクセスを避けることです。
したがって、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);
}
ほぼすべてだこと。また、削除することに注意してください
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を使用すると、簡単に、残りの通話とあなたをテストすることができます素晴らしいテストフレームワークでありますRestTemplateで作業中に障害物やボイラープレートのコードを取り除くことができます。たぶんあなたはそれを試してみたいです。
- 1. ログアウト時にJWT破棄トークン
- 2. GolangとJWT - シンプルなログアウト
- 3. スプリングブート、jwt、ジャージ、スプリングセキュリティ、CORSの問題
- 4. スプリングブート+セキュリティ+ JWTはトークンを生成できません
- 5. スプリングブート複数のJWTを使用する複数のルート
- 6. ログアウト後にJWT認証トークンが無効にならない5.4
- 7. rest framework jwtを使用してログアウトする方法
- 8. ノードエクスプレスでJWT(JsonWebToken)ログアウトを実装する方法
- 9. ログアウト時にフラスコJWTを無効にする
- 10. Azure SSOログアウト後もJWTトークンは有効です
- 11. スプリングブートとスプリングブートNullPointerException
- 12. JWTベースのシングルサインオン認証アーキテクチャでログアウトを実装する方法は?
- 13. スプリングブート。
- 14. スプリングブート管理者1.5.1は、スプリングブート1.5.2.RELEASE
- 15. Google Endpoints JWT Limited JWTクレームパススルー
- 16. ジャンゴ - JWTは中ジャンゴrestframework JWT
- 17. スプリングブート、セッションセキュリティ
- 18. スプリングブートOAuth2
- 19. スプリングブートpostgreSQL
- 20. スプリングブートAbstractRoutingDataSource
- 21. @EnableTransactionManagement(スプリングブート)
- 22. スプリングブート@RestController
- 23. Webjars-スプリングブート
- 24. スプリングブート+バッチマルチモジュールプロジェクト
- 25. スプリングブート:microApplication
- 26. JWT
- 27. JWT
- 28. ログアウト
- 29. スプリングブートのエラスティックサーチコンフィギュレーション
- 30. IndexOutOfBoundsExceptionスプリングバッチとスプリングブート