Ошибка invalid_token при обмене Google id_token на набор токенов Keycloak - PullRequest
1 голос
/ 10 апреля 2020

Я создаю поток аутентификации между мобильным приложением и клавиатурой для ключей, используя 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

1 Ответ

1 голос
/ 14 апреля 2020

Чтобы ответить на мой собственный вопрос: решение состоит в том, чтобы получить access_token (не identity_token) от Google, который можно затем обменять без проблем.

...