所以我有一个消耗api的客户端。该API使用密钥斗篷进行保护。用户可以正常登录,但是我想允许用户登录而不必使用他们的社交媒体帐户(例如facebook或google)进入keycloak的登录页面。我需要一个REST 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(); }
Keycloak开箱即用。参见https://www.keycloak.org/docs/6.0/server_admin/#_client_suggested_idp
OIDC应用程序可以通过指定要使用哪个身份提供者的提示来绕过Keycloak登录页面。 这是通过在授权码流授权端点中设置kc_idp_hint查询参数来完成的。
OIDC应用程序可以通过指定要使用哪个身份提供者的提示来绕过Keycloak登录页面。
这是通过在授权码流授权端点中设置kc_idp_hint查询参数来完成的。
更新
在您的情况下,您应该使用常规的Keycloak Auth Code Flow端点,并且除了基本查询参数外,还应提供kc_idp_hint参数。这样,首先将用户重定向到Keycloak登录页面,然后Keycloak将其重定向到所选身份提供者登录页面(在您的情况下为Google)。
kc_idp_hint
这是重定向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登录页面。
kc_idp_hint=google