2017-01-18 7 views
0

Мне нелегко пытаться выяснить, как использовать Amazon Cognito в своем веб-приложении (на основе Java). Я хочу иметь какой-то аутентификационный центр (Amazon Cognito) для аутентификации пользователя с несколькими Auth Providers - вот почему я хочу использовать Amazon Cognito! :)Authenticate with Cognito Federated Identities

Во-первых, я настроил пул пользователей (у меня есть UserPoolId: eu-central-1_xxxxxxxxxx) и создал там одного пользователя. Затем я создал Identity Pool с IdentityPoolId (eu-central-1: yyyyyyyyyyy). Затем я аутентифицирую с помощью AWS JavaScript SDK для UserPool, чтобы получить idToken, и он работает отлично! Я получаю idToken от Cognito UserPool. Затем я отправляю этот idToken в свое backend-приложение (на основе Java), и там я хочу проверить этот idToken с IdentityPool. Я добавил новый Authentication Provider - Cognito с UserPoolId и недавно созданный идентификатор приложения, который я добавил в UserPool. Я пытался следовать с этим руководством: https://aws.amazon.com/blogs/mobile/use-amazon-cognito-in-your-website-for-simple-aws-authentication/ Но каждый раз, когда я делаю

GetID 

запрос I Recevied Exception с

com.amazonaws.services.cognitoidentity.model.NotAuthorizedException: Token is not from a supported provider of this identity pool. 

Мой Java код ниже:

final AmazonCognitoIdentityClient identityClient = new AmazonCognitoIdentityClient(
       new BasicAWSCredentials("accessKey", "secretKey")); 
identityClient.setRegion(Region.getRegion(Regions.EU_CENTRAL_1)); 

GetIdRequest idRequest = new GetIdRequest(); 
idRequest.setAccountId("accountId"); 
idRequest.setIdentityPoolId(identityPoolId); 

final String providerName = "cognito-idp.eu-central-1.amazonaws.com/eu-central-1_xxxxxxxx"; 

Map providerTokens = new HashMap(); 
providerTokens.put(providerName, idToken); 
idRequest.setLogins(providerTokens); 

GetIdResult idResp = identityClient.getId(idRequest); 

ли кто-нибудь мог Помогите мне с этой задачей? Может быть, я что-то делаю неправильно?

Спасибо, Камиль :)

ответ

0

Когда вы создали ваш бассейн пользователь дважды проверьте наличие всех ожидаемых федеративных провайдеров поддерживаемых. Если вы используете аутентификацию разработчика, обязательно добавьте этот домен «login ....». Захватите свой токен и посмотрите на него в jwt.io для подсказок.

1

Есть три части данных, которые должны соответствовать в этом сценарии:

  • Provider запроектирована в AWS.
  • Провайдер, поставленный на карте Logins.
  • iss значение (эмитент) в токене идентификатора.

Когда я увидел эту ошибку, это произошло потому, что значение на карте входа не соответствует провайдеру, настроенному в AWS.

Например, неожиданный номер порта или trailing slash может привести к тому, что они не совпадут.

Помимо этого, в AWS есть несколько настроек, которые необходимо выстраивать в линию.

Provider как сконфигурировано в AWS

С Cognito пользователя Pool, Amazon настраивает это имя для вас, так что это не настраивается на интерфейсе. Формат providerName в вашем Java-коде выглядит неплохо, но сначала я трижды проверил часть xxxxxxx на наличие опечатки.

Настройки клиента App

Затем убедитесь, что ваш клиент App позволило Cognito в настройках пользователя Бассейн:

Cognito enabled for App Client

Федеративные идентичностей настройки

Далее, в настройки федеративных идентификаторов, убедитесь, что идентификатор пула пользователя и идентификатор клиента отображаются в Cognito ta b в разделе «Аутентификационные провайдеры» и что они соответствуют вашему пулу пользователей и App Client.

Federated Identities settings

JWT эмитента

Наконец, я хотел бы ожидать, что ошибка будет "Invalid login token. Issuer doesn't match providerName", если возникла проблема со значением iss в JWT. Тем не менее, декодирование маркера id, которое вы возвращаете и проверяющее содержимое (как предлагается в другом ответе), также является хорошим советом.

Если все эти штуки находятся на месте, и ошибка сохраняется, пожалуйста, оставьте комментарий. Счастливый взлом!

Смежные вопросы