春ブーツ/ Keycloakとバックエンド・ツー・バックエンドを認証する方法

programmingFox:

私は春のセキュリティとJWT-トークン(Keycloakにおけるベアラのみの設定)でKeycloakと春のブートを使用してmicroservice指向アプリケーションの私のバックエンドサービス全体の認証を実装しようとしています。

私は、RESTエンドポイントにアクセスするための認証を必要とするバックエンドサービスを提供しています。このサービスは、Web UIのためのデータを提供し、それが後で処理できるように、データベースに格納するデータを取ります。また、UI内のユーザーと、すでにそのバックエンドサービスに対するUIの仕事の両方の認証。

次いで、バックグラウンドで実行されるが、また、最初に述べたバックエンドサービスで存在すべき値を計算することを他のバックエンドサービスがあります。1つは、認証、仕事へのHTTPポストのための他のバックエンドサービスに対して認証をKeycloakからアクセストークンを取得するための計算最初のニーズをやってサービスを必要とします。

私はKeycloakRestTemplateとHTTPポストをやろうとしているが、私は.postForObjectメソッドを呼び出すと、私は例外を取得します:

Caused by: java.lang.IllegalStateException: Cannot set authorization header because there is no authenticated principal
    at org.keycloak.adapters.springsecurity.client.KeycloakClientRequestFactory.getKeycloakSecurityContext(KeycloakClientRequestFactory.java:70)
    at org.keycloak.adapters.springsecurity.client.KeycloakClientRequestFactory.postProcessHttpRequest(KeycloakClientRequestFactory.java:55)
    at org.springframework.http.client.HttpComponentsClientHttpRequestFactory.createRequest(HttpComponentsClientHttpRequestFactory.java:160)

計算サービスは、他のRESTサービスを呼び出す前に、自動的にトークン認証を取得していないようです。私はこれらすべてのKeycloakの特定のクラスについてGoogleで多くの研究をしましたが、私は何をする必要があるかを知るませんでした。

誰も私にヒントを与えてくださいことはできますか?また、私はここでは関係である春の設定の一部を知りませんが、あなたがそれらを必要とする場合、私はそれらを提供します。

EDIT

このような計算サービスルックスのマイapplication.properties:

keycloak.auth-server-url=https://localhost/auth
keycloak.realm=myrealm
keycloak.bearer-only=true
keycloak.resource=backend-service2
keycloak.principal-attribute=preferred_username
keycloak.cors=true
keycloak.realm-key=<PUBKEY>
keycloak.credentials.secret=<SECRET_UUID_STYLE>
keycloak.use-resource-role-mappings=true

更新

おかげ@Saiのprateekと@Xtremeバイカー。それは正しい方向に私をリードしているようです。

私はkeycloak設定が間違っていると思うが、私はこのソリューションを適用するが、私はまだ例外を取得します。WebUIの、バックエンド・サービス1、バックエンドサービス2:私は今keycloakで3つのクライアントを持っています。

アクセスタイプ:公共のWebUIは以下のように設定されています

アクセスタイプ:バックエンドサービス1のように構成されているベアラのみ

アクセスタイプ:バックエンドサービス2のように構成されているベアラのみ

例外は次のとおりです。

2019-02-18 11:15:32.914 DEBUG 22620 --- [  restartedMain] o.s.web.client.RestTemplate              : POST request for "http://localhost:<PORT>/auth/realms/<REALM_NAME>/protocol/openid-connect/token" resulted in 400 (Bad Request); invoking error handler

Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: error="access_denied", error_description="Access token denied."
    at org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport.retrieveToken(OAuth2AccessTokenSupport.java:142)
    at org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsAccessTokenProvider.obtainAccessToken(ClientCredentialsAccessTokenProvider.java:44)
    at org.springframework.security.oauth2.client.token.AccessTokenProviderChain.obtainNewAccessTokenInternal(AccessTokenProviderChain.java:148)
    at org.springframework.security.oauth2.client.token.AccessTokenProviderChain.obtainAccessToken(AccessTokenProviderChain.java:121)
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.acquireAccessToken(OAuth2RestTemplate.java:221)
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.getAccessToken(OAuth2RestTemplate.java:173)
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.createRequest(OAuth2RestTemplate.java:105)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:683)
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.doExecute(OAuth2RestTemplate.java:128)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:644)
    at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:399)
[STRIPPED]


    ... 5 more
Caused by: error="invalid_client", error_description="Bearer-only not allowed"
    at org.springframework.security.oauth2.common.exceptions.OAuth2ExceptionJackson2Deserializer.deserialize(OAuth2ExceptionJackson2Deserializer.java:80)
    at org.springframework.security.oauth2.common.exceptions.OAuth2ExceptionJackson2Deserializer.deserialize(OAuth2ExceptionJackson2Deserializer.java:33)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4001)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3072)
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:237)
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readInternal(AbstractJackson2HttpMessageConverter.java:217)
    at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:198)
    at org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport$AccessTokenErrorHandler.handleError(OAuth2AccessTokenSupport.java:237)
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:730)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:688)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:654)
    at org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport.retrieveToken(OAuth2AccessTokenSupport.java:137)
    ... 18 more

また、私が変更されたことをノートkeycloak.auth-server-urlhttp://localhost:<PORT>/auth証明書の検証が開発中で、自己署名証明書による失敗しないように(なしHTTPS)を。

programmingFox:

OK、ソリューションを自分自身を見つけた:私はkeycloak内部の「バックエンド・サービス2」のためのクライアントの設定でONにスイッチ「サービスアカウントが有効になって」ボタンを設定する必要がありました。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=180251&siteId=1