6

当我单击 Google 登录时,我使用以下代码在 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
    );

我已经使用管理联合身份在 Cognito 中添加了 Google 客户端 ID。我已经交叉检查了 IAM accounts.google.com 中的所有密钥,一切似乎都很完美。

 final Map<String, String> logins = new HashMap<String, String>();
 logins.put("accounts.google.com", account.getIdToken());

 credentialsProvider.setLogins(logins);
 credentialsProvider.refresh();

当我尝试使用以下代码获取身份 ID 时出现错误 - 令牌不是来自此身份池的受支持提供商。可能是什么错误?

 credentialsProvider.getIdentityId();
4

3 回答 3

5

在我的例子中,我的 IAM 身份提供者为 accounts.google.com 有一个尾部斜杠,如下所示:

IAM 提供商列表

带有斜线的那个是错误的;没有斜杠的那个可以正常工作。有趣的是,AWS 将为这两者获取相同的指纹。

在 AWS IAM 控制台的 Accounts > Providers > accounts.google.com 下,将“Android client for com.example.yourstuff(由 Google Service 自动创建)”的密钥添加为受众。它看起来像“222222222222-x8x8x8x8x8x8x8x8x8x8x8x8x8x8x8x8.apps.googleusercontent.com”(然后,当您调试时,继续,所有其余键作为受众条目;您可以稍后返回并找出可以删除哪些键.)

在调用 时GoogleSignInOptions.Builder,您需要在 Goole APIs > API Manager > Credentials 页面上的 OAuath 2.0 客户端 ID 下使用 Web 应用程序密钥调用 #requestIdToken:

GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
  .requestIdToken("999999whateverxxxx.apps.googleusercontent.com")
  .build()

(令牌可以被缓存;如果您使用 requestIdToken 调用运行您的应用程序,然后删除 requestIdToken 调用并再次运行,您仍然可以通过调用 GoogleSignInAccount 对象上的 getIdToken() 获得结果。)

谷歌登录代码最终会给你一个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 > Providers > 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.)

如果您尝试像这样将 accounts.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.)例外。

(我怀疑还有很多其他的失败方式;这些只是我发现的。)

于 2017-07-15T16:24:31.860 回答
5

首先检查您是否使用了正确的用户池 ID。如果是,则打开 aws cognito 控制台,选择 Federated Identities,然后选择您在“Auth.configure”中传递的身份池。然后单击“编辑身份池”,然后转到选项卡“身份验证提供程序”。在它下面,第一个选项卡是“Cognito”,按下解锁用户池 ID 和应用程序客户端 ID 并在那里传递正确的值。然后你就可以成功登录了。

于 2019-01-17T15:16:04.997 回答
-1

您需要使用 Cognito 在后端配置中添加 Google Provider App ID 以使其正常工作。您可以通过具有您的池 ID 的 Cognito 控制台或 Mobile Hub 控制台执行此操作。

谢谢,罗汉

于 2017-06-09T21:22:01.897 回答