Keycloak Identity Broker API - PullRequest
       20

Keycloak Identity Broker API

0 голосов
/ 26 июня 2019

Итак, у меня есть клиент, который потребляет API.API защищен с помощью keycloak.Пользователи входят в систему нормально, но я хочу разрешить пользователям входить в систему без необходимости заходить на страницу входа в keycloak со своими учетными записями в социальных сетях, таких как Facebook или Google.Мне нужен API отдыха с реализацией того, как сгенерировать URL-адрес, поэтому, когда пользователь нажимает на этот URL-адрес в кнопке, он переходит на соответствующую страницу входа в систему для входа в систему, в то время как 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();

    }

1 Ответ

0 голосов
/ 26 июня 2019

Keycloak поддерживает это из коробки.См. https://www.keycloak.org/docs/6.0/server_admin/#_client_suggested_idp

Приложения OIDC могут обойти страницу входа в Keycloak, указав подсказку, какого поставщика удостоверений они хотят использовать.

Это делается путем установки параметра запроса kc_idp_hint вконечная точка авторизации потока кода авторизации.

ОБНОВЛЕНИЕ

В вашем случае следует использовать обычную конечную точку потока кода аутентификации Keycloak и в дополнение к основным параметрам запроса предоставитьkc_idp_hint парам.Таким образом, пользователь сначала перенаправляется на страницу входа в Keycloak, а затем Keycloak перенаправляет его на страницу входа выбранного провайдера идентификации (в вашем случае Google).

Вот пример 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=google к URL-адресу и нажмите ENTER.Затем вы будете перенаправлены прямо на страницу входа в Google.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...