我正在尝试使用 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 身份提供者的支持。请按照以下步骤操作:
- 转到 AWS IAM 控制台的身份提供商部分。
- 创建一个 OpenId Connect 身份提供者,提供者 URL 为 https://accounts.google.com和 Audience 作为客户 ID 之一。
- 按照创建身份提供商的步骤进行操作,稍后您将可以选择添加其他客户端 ID。
- 转到 Amazon Cognito 控制台。
- 创建或编辑身份池并将 OpenID 连接身份提供商添加到池中。这将允许您信任多个客户端 ID。
谷歌登录可以按照Cognito文档here和 OpenID 连接提供商 here .
此外,您获得的 token 实际上是 Base64 编码的。它分为三个部分,中间用句点分隔。
- 使用的算法。
- 有效载荷。
- Cognito 验证的签名。
您可以使用 this解码 token 的好工具。
谢谢,
拉集
关于ios - 从 Google 登录 SDK 获取 AWS 的跨客户端 ID token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30770890/