1つのkeycloakクライアントが別のkeycloakクライアントと通信しているところで、KecloakRestTemplateを使用できます。ただし、最初のキークローキングクライアントにログインした場合、つまりクライアントID、クライアントシークレット、ユーザー名、パスワードをキークローキングサーバーに送信した場合にのみ機能します。最初のクライアントでユーザーとパスワードで認証されていない場合は、「認証された原則がないため、認証ヘッダーを設定できません」というメッセージが表示されます。しかし、最初のクライアント(Client Credential Grant)にサービスアカウントを使用するようにkeycloakを設定しました。したがって、ユーザー/パスワードを使用すべきではなく、クライアントID /秘密のみに頼るべきです。これはOAuth 2仕様のバグ/逸脱ですか?Keycloakスプリングセキュリティクライアントクレデンシャルの付与
答えて
私のマイクロサービスアーキテクチャベースのアプリケーションでは、私はユーザーアカウントとクライアントアカウントの両方を使用しています。私は春のセキュリティアダプターは、ユーザー関連のもの(私が使用しているバージョン、少なくとも2.2.1です)の世話をすると思います。私がやることは、別のRestTemplate
を持って、クライアントとしてリソースにアクセスするために自分自身を処理するものです。一例として、
:
@Service
public class RemoteAccessService{
//Manages user access
private KeycloakRestTemplate userAccessRestTemplate;
//Manages client access
private RestTemplate clientAccessRestTemplate;
public RemoteAccessService(KeycloakRestTemplate userAccessRestTemplate,
@Qualifier("clientAccessRestTemplate") RestTemplate clientAccessRestTemplate;){
}
}
その後、あなたはクライアントの認証を管理するために@Configuration
クラスでRestTemplate
豆を構築:もちろん
@Bean
public RestTemplate clientAccessRestTemplate() {
RestTemplate template = new RestTemplate();
template.getMessageConverters().add(new FormHttpMessageConverter());
template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
template.getInterceptors().add(new ClientHttpRequestInterceptor() {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body,
ClientHttpRequestExecution execution) throws IOException {
//Intercept each of the requests performed by this template
//and add the client access token in the Authorization header
HttpRequest wrapper = new HttpRequestWrapper(request);
if (clientAccessToken != null) {
wrapper.getHeaders().set("Authorization",
"Bearer " + clientAccessToken.getToken());
}
return execution.execute(wrapper, body);
}
});
return template;
}
を、あなたは「あなたのことを確認する必要がありますインターセプタ内に適切なclientAccessToken
がある場合は、そうでなければ401または403のコードを取得します。ここでは、OAuthでこれを実行する方法についてpostがあります(ユーザー/パスワードは必要なく、クライアントの認証情報は必要ありません)。
サイドクローズアダプタはいくつかの状況を管理するのに便利ですが、より強力な方法であるキークローキングのすべての機能にアクセスすることはできません。
KeycloakRestTemplate
は、クライアントID、クライアントシークレット、ユーザー名、およびパスワードをKeycloakサーバーに送信します。私はクライアントIDと秘密だけを送りたいと思っていました。私はこれを行うOAuth2RestTemplate
のKeycloakClientCredentialsRestTemplate
サブクラスを作成しました。 SpringブートでOAuth2サポートを使用して、クライアントクレデンシャルを付与します。 Keycloakプロパティはapplication.properties
からも取得されます。また
import org.springframework.security.oauth2.client.OAuth2ClientContext;
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails;
public class KeycloakClientCredentialsRestTemplate extends OAuth2RestTemplate {
public KeycloakClientCredentialsRestTemplate(OAuth2ProtectedResourceDetails resource,
OAuth2ClientContext context) {
super(resource, context);
}
}
:
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.security.oauth2.client.DefaultOAuth2ClientContext;
import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails;
import org.springframework.security.oauth2.common.AuthenticationScheme;
import org.springframework.stereotype.Service;
@Service
public class KeycloakClientCredentialsConfig {
@Value("${keycloak.realm}")
private String realm;
@Value("${keycloak.auth-server-url}")
private String authServerUrl;
@Value("${keycloak.resource}")
private String clientId;
@Value("${keycloak.credentials.secret}")
private String clientSecret;
@Bean
public KeycloakClientCredentialsRestTemplate createRestTemplate() {
return new KeycloakClientCredentialsRestTemplate(getClientCredentialsResourceDetails(),
new DefaultOAuth2ClientContext());
}
private ClientCredentialsResourceDetails getClientCredentialsResourceDetails() {
String accessTokenUri = String.format("%s/realms/%s/protocol/openid-connect/token",
authServerUrl, realm);
List<String> scopes = new ArrayList<String>(0); // TODO introduce scopes
ClientCredentialsResourceDetails clientCredentialsResourceDetails =
new ClientCredentialsResourceDetails();
clientCredentialsResourceDetails.setAccessTokenUri(accessTokenUri);
clientCredentialsResourceDetails.setAuthenticationScheme(AuthenticationScheme.header);
clientCredentialsResourceDetails.setClientId(clientId);
clientCredentialsResourceDetails.setClientSecret(clientSecret);
clientCredentialsResourceDetails.setScope(scopes);
return clientCredentialsResourceDetails;
}
}
- 1. Keycloakログアウトリクエスト
- 2. KeyCloak 2.3
- 3. Keycloakスプリングブートコンフィギュレーション
- 4. ログインループ(アクセスコントロール)に固定されたKeyCloak付きの角4
- 5. RecyclerView付与エラー
- 6. 付与SELECTアクセス
- 7. Keycloak JWTの生成
- 8. Keycloak MySqlの設定
- 9. OpenID Keycloakレルムのカスタムオーセンティケータ
- 10. ASP.NETコアのKeycloakクライアント
- 11. Keycloak言語サポート
- 12. KeyCloakユーザーフェデレーションとダイナミックロール
- 13. Keycloak - アイデンティティプロバイダとクライアント
- 14. Keycloak例外は
- 15. Keycloakプロバイダとユーザストレージ
- 16. SSO with keycloak
- 17. Keycloak、openId-connect userInfo
- 18. KeyCloak Visual Studio
- 19. keycloak外部データベーススキーマ
- 20. cassandrauuidとkeycloak id
- 21. Keycloak`sユーザー
- 22. Keycloak - Infinispan Redisキャッシュストア
- 23. Perlモジュールのクレジットを付与
- 24. 認証コードの付与
- 25. WS02のカスタム付与タイプ5.2.0
- 26. アクセス権の付与ApplicationPoolIdentity
- 27. ZuulリバースプロキシとKeycloakサーバ
- 28. Keycloak Access-Control-Allow-Origin
- 29. Keycloak access_token forward from idp
- 30. Keycloak Google Identity Providerエラー