Я создаю поток аутентификации между мобильным приложением и клавиатурой для ключей, используя google в качестве провайдера идентификации. У меня возникли проблемы при попытке обменять id-токен Google на набор ключей токенов JWT.
Для клиента (на стороне приложения) я настроил собственный GoogleSignin (вызывается с помощью областей «userinfo.profile» и «userinfo.email»] и создал клиента OAuth2 android в консоли разработчика Google .
Я также создал веб-клиент в консоли Google для получения учетных данных client_id и client_secret (для использования с keycloak) и добавил redirect_url
в инструментальную панель keycloak. настроить google в качестве провайдера идентификации, используя учетные данные веб-клиента, с политикой обмена токенами для клиента my-app в my-realm.
На этом этапе после входа в приложение я получаю идентификатор id_token JWT. от Google:
{:scopes #js ["https://www.googleapis.com/auth/userinfo.profile" "https://www.googleapis.com/auth/userinfo.email"], :serverAuthCode nil, :idToken "eyJhb...", :user #js {:photo "http://photo.jpg", :email "fubar@fu.bar", :familyName "Bar", :givenName "Fu", :name "Fu Bar", :id "1234"}}
Затем я прошу keycloak обменять его на свои собственные токены в пределах области, чтобы приложение могло go вернуться к "нормальному" потоку аутентификации:
curl -X POST \
-d "client_id=my-app" \
-d "client_secret=mkU..." \
--data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
--data-urlencode "subject_token_type=urn:ietf:params:oauth:token-type:access_token" \
-d "subject_issuer=google" \
-d "audience=my-app" \
-d "subject_token=${idToken}" \
http://localhost:8080/auth/realms/my-realm/protocol/openid-connect/token
но это не удается, при регистрации в журнале регистрации «сбоя вызова»:
keycloak_1 | 12:17:39,810 DEBUG [org.keycloak.authentication.AuthenticationProcessor] (default task-1) AUTHENTICATE CLIENT
keycloak_1 | 12:17:39,810 DEBUG [org.keycloak.authentication.ClientAuthenticationFlow] (default task-1) client authenticator: client-secret
keycloak_1 | 12:17:39,811 DEBUG [org.keycloak.authentication.ClientAuthenticationFlow] (default task-1) client authenticator SUCCESS: client-secret
keycloak_1 | 12:17:39,811 DEBUG [org.keycloak.authentication.ClientAuthenticationFlow] (default task-1) Client authenticated by client-secret
keycloak_1 | 12:17:39,839 DEBUG [org.keycloak.broker.oidc.OIDCIdentityProvider] (default task-1) GOOGLE userInfoUrl: https://openidconnect.googleapis.com/v1/userinfo
keycloak_1 | 12:17:39,892 DEBUG [org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider] (default task-1) Failed to invoke user info status: 401
keycloak_1 | 10:49:10,055 WARN [org.keycloak.events] (default task-9) type=TOKEN_EXCHANGE_ERROR, realmId=my-realm, clientId=my-app, userId=null, ipAddress=172.18.0.1, error=invalid_token, reason='user info call failure', auth_method=token_exchange, grant_type=urn:ietf:params:oauth:grant-type:token-exchange, subject_issuer=google, validation_method='user info', client_auth_method=client-secret