web-dev-qa-db-ja.com

APIを使用してKeycloakにログインする

Application1Application2の2つの異なるアプリケーションがあります。

  1. Application2をkeycloakと統合しました。Keycloakのログインページを使用してこのアプリケーションにログインできます。

  2. 今私が欲しいのは、Application1(keycloakなし)にログインすると、keycloakのAPIを呼び出してapplication2にログインできるようになるはずです(keycloakのログインページをレンダリングせずに)。

実現可能ですか?はいの場合、どのように?

どんな助けも大歓迎です。

ありがとう

16
Akhil Prajapati

ユーザーにApplication1がキークロークの資格情報を安全に管理することを信頼するように効果的に要求しています。これは推奨されません

  1. ユーザーが資格情報を入力するためにキークロークにリダイレクトされると、セキュリティが向上します。理想的な世界では、クライアントアプリケーションがユーザー資格情報を処理したり、アクセスしたりすることはありません。
  2. ユーザーが最初にアクセスする必要があるアプリケーションの資格情報のみを入力する必要があるシングルサインインの目的を無効にします(セッションの有効期限が切れていない場合)

しかし、制御し、信頼できる場合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エラーになります。

16

私があなたの質問を正しく受け取ったら、すでにログインしている別のアプリケーションを介してベアラのみのサービスを呼び出そうとしていますが、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サービスによって生成された実際の有効なトークンを別のサービスに送信できます。

4
Fabio HSA

[〜#〜] yes [〜#〜]-Application-1にログインできますkeycloakログインインターフェイスを使用せずに。

これを達成するために、さまざまなクライアントアダプタが利用可能です。ここでは、アプリケーションのフレームワークについて言及していません。

Keyclaokクライアントアダプタの詳細を知るには: ここをクリック

たとえば、Node.jsアダプターを選択している場合は、リンクをたどることができます: node.js adapter

node.jsアダプターを使用したkeycloak実装、REST apiおよびトークン検証メカニズムに関する詳細は、このリンクで詳しく説明されています クリック例

1
basith