ios - 从 Google 登录 SDK 获取 AWS 的跨客户端 ID token

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

我正在尝试使用 Google 登录 SDK 在 iOS 应用程序中将 Google 与 Amazon Cognito 集成,但我似乎无法弄清楚如何正确获取 JWT id token 。我相信一切都设置正确,因为 Google 登录和 Cognito 都是独立工作的。

我正在这样设置 GIDSignIn。

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

然后获取id_token,指定为here异常(exception)情况是我使用的是 Google 登录而不是 Google+ 登录,后者没有 GTMOAuth2Authentication。

- (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 token,它只是一大堆字符。 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 上做过所有这些。在安卓上我做了:

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

以检索 token ,但据我所知,在 iOS 上没有类似的东西。如果需要,我可以提供更多信息。

谢谢!

最佳答案

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

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

谷歌登录可以按照Cognito文档here和 OpenID 连接提供商 here .

此外,您获得的 token 实际上是 Base64 编码的。它分为三个部分,中间用句点分隔。

  1. 使用的算法。
  2. 有效载荷。
  3. Cognito 验证的签名。

您可以使用 this解码 token 的好工具。

谢谢,
拉集

关于ios - 从 Google 登录 SDK 获取 AWS 的跨客户端 ID token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30770890/

相关文章:

amazon-web-services - Cognito 登录的 Lambda 函数第一次不起作用

ios - 在 firebase 中插入而不是更新

ios - 将JSON响应分配给模型SwiftUI

r - 如何使用 AWS CLI 仅复制 S3 存储桶中与给定字符串模式匹配的文件

java - 使用 API 网关进行 Cognito 用户池身份验证和授权

authentication - 将 AWS Cognito 用户迁移到 Auth0

在 iOS 上调用 "TypeError: Load Failed"时出现 Javascript "fetch"错误

ios - 使用 UIActivityViewController 提供缩略图

php - 如何在 AWS Amazon Linux AMI 中安装任何 php 扩展?

apache - 比特纳米 AH02042 : rejecting client initiated renegotiation