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

带有斜线的那个是错误的;没有斜杠的那个可以正常工作。有趣的是,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.)
例外。
(我怀疑还有很多其他的失败方式;这些只是我发现的。)