从Google登录SDK获取AWS的跨客户端ID令牌

时间:2015-06-11 03:09:40

标签: ios amazon-web-services amazon-cognito google-signin

我尝试使用Google登录SDK在iOS应用程序中集成G​​oogle与Amazon Cognito,但我似乎无法弄清楚如何正确获取JWT ID令牌。我相信,所有内容都设置正确,因为Google Sign-In和Cognito都是独立工作的。

我正在设置GIDSignIn。

[GIDSignIn sharedInstance].scopes = @[kGTLAuthScopePlusLogin, kGTLAuthScopeDrive];
[[GIDSignIn sharedInstance] setClientID:kClientID];
[GIDSignIn sharedInstance] setServerClientID:kServerClientId];

然后按照指定here获取id_token,但我使用的是Google登录而不是Google+登录,但没有GTMOAuth2身份验证。

- (void)googleSignedIn:(GIDGoogleUser *) user
    {
    NSLog(@"AWSManager: Google signed in, id token = %@", user.authentication.idToken);
    NSString *idToken = user.authentication.idToken;
    self.credentialsProvider.logins = @{ @(AWSCognitoLoginProviderKeyGoogle): idToken};

但是idtoken不是json格式的web令牌,它只是一大块字符。 AWS抛出此错误 -

AWSiOSSDKv2 [Error] AWSIdentityProvider.m line:185 
| __51-[AWSAbstractCognitoIdentityProvider getIdentityId]_block_invoke169 
| GetId failed. 

Error is [Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=9 
"The operation couldn’t be completed. (com.amazonaws.AWSCognitoIdentityErrorDomain error 9.)" 
UserInfo=0x8fa5eb8e4e40{__type=NotAuthorizedException, message=Token is not from a supported provider of this identity pool.}]

我不知道我要做什么。我对objective-c很新,并且之前在Android上完成了所有这些工作。在android上我做了:

   String mServerClientId = "audience:server:client_id:xxxxxxxxxx.apps.googleusercontent.com"
   String token = GoogleAuthUtil.getToken(getApplicationContext(), accountName, mServerClientId);

检索令牌,但我可以告诉他们在iOS上没有这样的东西。如果需要,我可以提供更多信息。

谢谢!

1 个答案:

答案 0 :(得分:8)

从错误看,在身份池配置中未正确设置clientId。 Google为每个平台提供了不同的客户端ID,为了支持多个客户端ID,您应该使用Cognito对通用OpenID Connect身份提供商的支持。请按照以下步骤操作:

  1. 转到AWS IAM控制台的身份提供商部分。
  2. 创建一个OpenId Connect Identity Provider,其提供者URL为https://accounts.google.com,Audience为客户ID之一。
  3. 按照步骤创建身份提供程序,稍后您将可以选择添加其他客户端ID。
  4. 转到Amazon Cognito控制台。
  5. 创建或编辑标识池,并将OpenID连接标识提供程序添加到池中。这将允许您信任多个客户端ID。
  6. 您可以按照Google登录here和OpenID连接提供商here的Cognito文档进行操作。

    此外,您获得的令牌实际上是Base64编码的。它有三个部分用句号分隔。

    1. 使用的算法。
    2. 有效载荷。
    3. Cognito验证的签名。
    4. 您可以使用this酷工具来解码令牌。

      谢谢,
      Rachit