gpt4 book ai didi

ios - 如何使用 GIDSignIn 或 GIDAuthentication 刷新 authentication.idToken?

转载 作者:可可西里 更新时间:2023-11-01 04:50:40 24 4
gpt4 key购买 nike

更新 2015-10-28 - Release 2.4.0 of Google Sign-In for iOS似乎已经解决了这个问题,idToken 和 accessToken 都根据需要通过新的 GIDAuthentication 方法 getTokensWithHandler:refreshTokensWithHandler: 进行刷新。 GIDSignIn 方法 SignInSilently 也会刷新两个 token 。


我正在使用适用于 iOS 的 AWS 移动开发工具包,并且我已经使用 AWS Cognito Sync sample code 将 Google 登录作为 Cognito 凭证提供程序实现。作为基础。登录(以及随后的静默登录)流程正常运行,登录用户可以按预期访问 DynamoDB 等 AWS 资源。

我的问题是 user.authentication.idToken 在一小时后过期,此时对 AWS 服务的调用失败并出现身份验证错误。我可以使用

刷新 user.authentication.accessToken
[self.googleUser.authentication refreshAccessTokenWithHandler:^(NSString *accessToken, NSError *error) {...}

但这不会更新 idToken。我也试过打电话

[[GoogleSignIn sharedInstance] signInSilently];

它在 session 中第一次调用时为我提供了一个有效的 idToken,但尽管它成功完成,但它不会在同一 session 中的后续调用中刷新 idToken。

我一直在使用

检查/转储 token 内容
https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=<idToken>

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=<accessToken>

我不确定问题是 GIDSignIn 没有更新 idToken,还是 AWS 应该以某种方式使用 refreshToken 在后端自动刷新用户。无论哪种方式,我都没有想法。

下面的代码片段。我已经使用 GoogleSignIn 2.2.0 和 2.3.2 进行了测试,但遇到了同样的问题。

...
@interface MySignInClass <GIDSignInDelegate>
...
-(void) signInWithGoogle
{
GIDSignIn *signIn = [GIDSignIn sharedInstance];
signIn.clientID = MY_GOOGLE_CLIENT_ID;
signIn.shouldFetchBasicProfile = YES;
signIn.scopes = [NSArray arrayWithObjects:@"https://www.googleapis.com/auth/userinfo.profile", @"openid", nil];
signIn.delegate = self;
if([signIn hasAuthInKeychain]) {
[signIn signInSilently];
} else {
[signIn signIn];
}
}
...
- (void)signIn:(GIDSignIn *)signIn
didSignInForUser:(GIDGoogleUser *)user
withError:(NSError *)error
{
if (error != nil) {
[self handleSignInError:error]; // Handle error
}
else {
NSString *idToken = user.authentication.idToken;
NSDictionary* logins = @{@"accounts.google.com": idToken};
self.credentialsProvider = [[AWSCognitoCredentialsProvider alloc]
initWithRegionType:MY_COGNITO_REGION_TYPE
identityId:nil
identityPoolId:MY_COGNITO_IDENTITY_POOL
logins:logins];
AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc]
initWithRegion:MY_COGNITO_REGION
credentialsProvider:self.credentialsProvider];
AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;
// AWSTask stuff removed for simplicity
AWSTask* task = [self.credentialsProvider getIdentityId];
...
}
}
...
- (void)signIn:(GIDSignIn *)signIn
didDisconnectWithUser:(GIDGoogleUser *)user
withError:(NSError *)error
{
[self handleGoogleSignout]; // Do signout stuff
}
...

最佳答案

调用 GIDSignIn's signInSilently method像这样:

[[GIDSignIn sharedInstance] signInSilently];

这最终会调用您的 signIn:didSignInForUser:withError:再次使用 idToken 委托(delegate)方法实现。

我已经用 2.4.0 release of Google Sign-In for iOS 验证了这一点上述使用 signInSilently 的方法确实可以为您提供一个未过期的新 idToken。

关于ios - 如何使用 GIDSignIn 或 GIDAuthentication 刷新 authentication.idToken?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33279485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com