令牌不是来自此身份池Amazon Mobile Hub Android的受支持提供商

Ani*_*udh 5 android amazon-mobile-hub

当我点击谷歌登录时,我使用以下代码在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
    );
Run Code Online (Sandbox Code Playgroud)

我使用manage Federated Identities在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();
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下代码获取身份ID时,我收到错误 - 令牌不是来自此身份池的受支持提供程序.可能是什么错误?

 credentialsProvider.getIdentityId();
Run Code Online (Sandbox Code Playgroud)

Jam*_*ore 5

就我而言,accounts.google.com 的 IAM 身份提供商中有一个尾部斜杠,如下所示:

IAM 提供商列表

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

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

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

GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
  .requestIdToken("999999whateverxxxx.apps.googleusercontent.com")
  .build()
Run Code Online (Sandbox Code Playgroud)

(令牌可以被缓存;如果您使用 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
  ...
Run Code Online (Sandbox Code Playgroud)

如果您没有在 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.)

如果您尝试将accounts.google.com/添加到像这样的登录哈希中(不要这样做,而是修复IAM身份提供商名称):

logins.put("accounts.google.com/", token);
Run Code Online (Sandbox Code Playgroud)

你会得到一个NotAuthorizedException(Invalid login token. Issuer doesn't match providerName)例外。

如果您使用错误的令牌,您将收到NotAuthorizedException (Invalid login token. Token signature invalid.)异常。

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


Ash*_*rma 5

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


小智 -1

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

谢谢,罗汉