Application1とApplication2の2つの異なるアプリケーションがあります。
Application2をkeycloakと統合しました。Keycloakのログインページを使用してこのアプリケーションにログインできます。
今私が欲しいのは、Application1(keycloakなし)にログインすると、keycloakのAPIを呼び出してapplication2にログインできるようになるはずです(keycloakのログインページをレンダリングせずに)。
実現可能ですか?はいの場合、どのように?
どんな助けも大歓迎です。
ありがとう
ユーザーにApplication1がキークロークの資格情報を安全に管理することを信頼するように効果的に要求しています。これは推奨されません
しかし、制御し、信頼できる場合Application1およびレガシーまたはその他の理由によりこれを行う必要がある場合は、Keycloakクライアント定義で「直接アクセス」と呼ばれるリソース所有者資格情報フローを有効にしてから、POST form-urlencoded
データ型としてのユーザーの資格情報
https://<keycloak-url>/auth/realms/<realm>/protocol/openid-connect/token
パラメータは
grant_type=password
client_id=<Application1's client id>
client_secret=<the client secret>
username=<the username>
password=<the password>
scope=<space delimited list of scope requests>
資格情報が無効な場合、応答は有効なJWTオブジェクトまたは4xxエラーになります。
私があなたの質問を正しく受け取ったら、すでにログインしている別のアプリケーションを介してベアラのみのサービスを呼び出そうとしていますが、Spring Bootまたはそれに似た別のフレームワークを使用しているかどうかも言及していなかったので、あなたはサーバー側アプリケーションにSpring Bootを使用します。
次の例は、認証されたAPIから別のAPIへの単純な呼び出しに反映され、どちらもSpring Bootを使用しています。
import org.keycloak.KeycloakPrincipal;
import org.keycloak.adapters.RefreshableKeycloakSecurityContext;
import org.keycloak.adapters.springsecurity.account.SimpleKeycloakAccount;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
@Component
public class AnotherServiceClient {
public TypeOfObjectReturnedByAnotherService getFromAnotherService() {
RestTemplate restTemplate = new RestTemplate();
String endpoint = "http://localhost:40030/another/service/url";
String bearerToken = getAuthorizationToken();
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "bearer " + bearerToken);
HttpEntity entity = new HttpEntity(headers);
ResponseEntity<TypeOfObjectReturnedByAnotherService> response = restTemplate.exchange(endpoint, HttpMethod.GET, entity, TypeOfObjectReturnedByAnotherService.class);
return response.getBody();
}
private String getAuthorizationToken() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
SimpleKeycloakAccount details = (SimpleKeycloakAccount) authentication.getDetails();
KeycloakPrincipal<?> keycloakPrincipal = (KeycloakPrincipal<?>) details.getPrincipal();
RefreshableKeycloakSecurityContext context = (RefreshableKeycloakSecurityContext) getPrincipal().getKeycloakSecurityContext();
return context.getTokenString();
}
}
その方法で、Originサービスによって生成された実際の有効なトークンを別のサービスに送信できます。
[〜#〜] yes [〜#〜]-Application-1にログインできますkeycloakログインインターフェイスを使用せずに。
これを達成するために、さまざまなクライアントアダプタが利用可能です。ここでは、アプリケーションのフレームワークについて言及していません。
Keyclaokクライアントアダプタの詳細を知るには: ここをクリック
たとえば、Node.jsアダプターを選択している場合は、リンクをたどることができます: node.js adapter
node.jsアダプターを使用したkeycloak実装、REST apiおよびトークン検証メカニズムに関する詳細は、このリンクで詳しく説明されています クリック例