KeycloakアイデンティティブローカーAPI

穀物:

だから私は、APIを消費クライアントを持っています。APIはkeycloakで固定されています。ユーザーは通常では看板、しかし、私は、ユーザーがFacebookなどのアカウントやGoogle彼らのソーシャルメディアでkeycloakのログインページを移動することなく、ユーザーに署名するようにしたいです。私はボタンでこのURLの際にユーザーがクリックので、生成されたURLを取得する方法を実装した残りのAPIが必要keycloakはまだブローカーとして機能している間、それはログインし、それぞれの社会的なログインページにユーザーがかかります。

以下は私の実装である、それはURL大丈夫を生成しますが、ログインにページをGoogleにユーザーを負いません。

これは残りのコントローラであります

    @Secured("permitAll")
    @GetMapping(path = "/generator")
    public String brokerGenerator(HttpServletRequest httpServletRequest) throws ServletException {
        String provider = "google";
        String authServerRootUrl = "http://localhost:8080/";
        String realm = "realmName";
        String clientId = "clientName";
        String nonce = UUID.randomUUID().toString();
        MessageDigest md = null;

        try {
            md = MessageDigest.getInstance("SHA-256");
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }

        String input = nonce + clientId + provider;
        byte[] check = md.digest(input.getBytes(StandardCharsets.UTF_8));
        String hash = Base64Url.encode(check);
        httpServletRequest.getSession().setAttribute("hash", hash);

        String redirectUri = "http://localhost:4200/dashboard"; 

        return KeycloakUriBuilder.fromUri(authServerRootUrl)
                .path("auth/realms/realmName/google/link")
                .queryParam("nonce", nonce)
                .queryParam("hash", hash)
                .queryParam("client_id", clientId)
                .queryParam("redirect_uri", redirectUri).build(realm, provider).toString();

    }
ヴァディムAshikhman:

Keycloakはボックスのこのアウトをサポートしています。参照してくださいhttps://www.keycloak.org/docs/6.0/server_admin/#_client_suggested_idpを

OIDCアプリケーションは、彼らが使用したいアイデンティティプロバイダにヒントを指定することにより、Keycloakのログインページをバイパスすることができます。

これは、認証コードフロー認可エンドポイントにkc_idp_hintクエリパラメータを設定することによって行われます。

更新

あなたのケースでは、通常のKeycloak認証コードフローのエンドポイントを使用する必要がありますし、基本的なクエリのparamsに加えて提供kc_idp_hintPARAMを。ユーザーが最初Keycloakのログインページにリダイレクトされ、この方法は、Keycloakは(あなたのケースでグーグル)選択したアイデンティティプロバイダのログインページに彼をリダイレクトします。

ここでは例のリダイレクトURLは次のとおりです。

https://keycloak-domain/realms/REALM_NAME/protocol/openid-connect/auth?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE&response_type=code&scope=openid&nonce=NONCE&kc_idp_hint=google

この例に従って、あなたのコードを編集します。

return KeycloakUriBuilder.fromUri(authServerRootUrl)
    .path("realms/realmName/protocol/openid-connect/auth") // Url changed
    .queryParam("response_type", "code") // Autherization Code Flow
    .queryParam("scope", "openid") // Add additional scopes if needed
    .queryParam("kc_idp_hint", "google") // This should match IDP name registered in Keycloak
    .queryParam("nonce", nonce)
    .queryParam("hash", hash)
    .queryParam("client_id", clientId)
    .queryParam("redirect_uri", redirectUri).build(realm, provider).toString();

あなたは、テストのためにKeycloakのリダイレクトを手動で開始することができます。通常のログインフローを起動し、資格情報を入力しないKeycloakのログインページにリダイレクトする場合、代わりに追加kc_idp_hint=googleURLにしてEnterキーを押します。そして、あなたは右、Googleのログインページにリダイレクトされます。

おすすめ

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