Токен не принадлежит поддерживаемому поставщику этого пула удостоверений Amazon Mobile Hub Android
Когда я нажимаю Google Login, я получаю токен в методе onActivityResult, используя следующий код:
GoogleSignInAccount account = result.getSignInAccount();
String token = account.getIdToken();
credentialsProvider = new CognitoCachingCredentialsProvider(
Login.this, // Context
"My Pool ID", // Identity Pool ID
Regions.US_EAST_1 // Region
);
Я добавил идентификатор клиента Google в Cognito, используя функцию управления федеративными удостоверениями. Я перепроверил все ключи в IAM account.google.com, все кажется идеальным.
final Map<String, String> logins = new HashMap<String, String>();
logins.put("accounts.google.com", account.getIdToken());
credentialsProvider.setLogins(logins);
credentialsProvider.refresh();
Когда я пытаюсь получить идентификатор с помощью приведенного ниже кода, я получаю сообщение об ошибке - токен не принадлежит поддерживаемому поставщику этого пула. В чем может быть ошибка?
credentialsProvider.getIdentityId();
2 ответа
В моем случае в моем поставщике идентификационных данных IAM для account.google.com была косая черта, например:
Тот, что с косой чертой, неправильный; тот, у которого нет косой черты, работает правильно. Интересно, что AWS получит одинаковый отпечаток для обоих.
В консоли AWS IAM в разделе Аккаунты> Провайдеры> account.google.com добавьте ключ для "Android-клиент для com.example.yourstuff (автоматически созданный службой Google)" в качестве аудитории. Это выглядит примерно так: "222222222222-x8x8x8x8x8x8x8x8x8x8x8x8x8x8x8x8x8x8x8x8.apps.googleusercontent.com" (Затем, когда вы отлаживаете, переходите ко всем остальным ключам в качестве записей аудитории; вы можете вернуться позже и выяснить, какие из них вы можете удалить.)
В призыве к GoogleSignInOptions.Builder
вам нужен вызов #requestIdToken с использованием ключа веб-приложения в разделе идентификаторов клиентов OAuath 2.0 на странице API Goole> API Manager > Страница учетных данных:
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("999999whateverxxxx.apps.googleusercontent.com")
.build()
(Токен может кэшироваться; если вы запускаете свое приложение с помощью вызова requestIdToken, затем удаляете вызов requestIdToken и запускаете снова, вы все равно можете получить результат от вызова getIdToken() для объекта GoogleSignInAccount.)
Код входа в Google в конечном итоге даст вам GoogleSignInAccount
объект. Вызовите #getIdToken для этого объекта, чтобы получить строку (в моем случае это 83 символа), которую вы собираетесь вставить в хэш входа в систему:
// pseudocode...
private fun fn(x: GoogleSignInAccount) {
val token = x.idToken // getIdToken if you're still using Java
val logins = HashMap<String, String>()
logins.put("accounts.google.com", token);
credentialsProvider.logins = logins
...
Если у вас нет правильного ключа, указанного в IAM > Поставщики> accounts.google.com, вы получите NotAuthorizedException(Invalid login token. Incorrect token audience.)
исключение.
Если вы добавили эту дополнительную косую черту к accounts.google.com/, вы получите NotAuthorizedException(Token is not from a supported provider of this identity pool.)
Если вы попытаетесь добавить account.google.com/ в хэш входа в систему следующим образом (не делайте этого, вместо этого исправьте имя поставщика удостоверений IAM):
logins.put("accounts.google.com/", token);
Вы получите NotAuthorizedException(Invalid login token. Issuer doesn't match providerName)
исключение.
Если вы используете неправильный токен, вы получите NotAuthorizedException (Invalid login token. Token signature invalid.)
исключение.
(Я подозреваю, что есть много других способов потерпеть неудачу; это только один, который я нашел.)
Сначала проверьте, используете ли вы правильный идентификатор пула пользователей. Если да, откройте консоль aws cognito, выберите "Объединенные удостоверения", затем выберите пул удостоверений, который вы передаете в "Auth.configure". Затем нажмите "Изменить пул удостоверений", затем перейдите на вкладку "Поставщики аутентификации". Под ним находится первая вкладка "Cognito", нажмите разблокировку идентификатора пула пользователей и идентификатора клиента приложения и передайте туда правильное значение. Тогда вы сможете успешно войти в систему.
Вам нужно добавить идентификатор приложения Google Provider в конфигурацию бэкэнда с помощью Cognito, чтобы он работал правильно. Вы можете сделать это из Cognito Console или Mobile Hub Console с вашим идентификатором пула.
Спасибо Рохан