Objective-C 中的 Google 用户 serverAuthCode nil

Posted

技术标签:

【中文标题】Objective-C 中的 Google 用户 serverAuthCode nil【英文标题】:Google User serverAuthCode nil in Objective-C 【发布时间】:2016-06-14 06:36:54 【问题描述】:

我正在尝试将 GoogleSignIn 框架集成到 ios 应用程序中,并在服务器上对用户进行身份验证。我设法登录了用户,但是在- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error委托方法中,user.serverAuthCodenil,我需要将这个服务器验证码传递给,呃,在服务器上验证用户。

我阅读了this documentation page,它指出我必须设置[GIDSignIn sharedInstance]serverClientID 属性,但是无处 没有说明我在哪里可以找到这个“服务器客户端ID”。我用世界上所有的钥匙进行了测试,但无济于事。

然后我发现this documentation page 似乎在试图告诉我们在哪里可以找到这个神奇的 id,但它使用的措辞很差,没有帮助。我确实有类型为 Web application 的 OAuth2 凭据,但是:

    它们用于 Web(客户端)应用程序,对应于我的 iOS 应用程序,它也与服务器通信 我尝试使用它,但它不起作用。

有没有人成功地摆脱了 Google (可怜的) 文档的控制?

【问题讨论】:

只需在 AppDelegate 中添加 [GIDSignIn sharedInstance].serverClientID = "Client_ID" 【参考方案1】:

尝试在模拟器中运行它:)

【讨论】:

它也发生在我的设备上.. serverAuthCode 为 nil 不知道为什么其他人不赞成。这正是我的情况。我正在使用 Xamarin。 我使用的是 iPhone 5S 模拟器(带有 iOS 8.4),它不会给我一个非零serverAuthCode。切换到设备修复它。有谁知道为什么模拟器在这里不起作用? 如果我在使用模拟器时卡住了怎么办? @BabkenVardanyan,不知道。自 2016 年以来,情况可能发生了变化。其他答案对您有帮助吗?【参考方案2】:

您可以在 plist 中找到 client_id,并且 server_client_id 可以通过 API 控制台管理器找到。

你必须先删除应用程序,然后再试一次,模拟器或设备,它会工作。

【讨论】:

【参考方案3】:

使用此配置获取不是nilserverAuthCode

NSError *configureError;

[[GGLContext sharedInstance] configureWithError:&configureError];

NSAssert(!configureError, @"Error configuring Google services: %@", configureError);

[GIDSignIn sharedInstance].clientID = @"88.....apps.googleusercontent.com";
[GIDSignIn sharedInstance].serverClientID = @"88.....apps.googleusercontent.com" ;
[GIDSignIn sharedInstance].shouldFetchBasicProfile = YES;
[GIDSignIn sharedInstance].scopes = @[@"email", @"profile"];

地点:

clientID 使用来自GoogleService-Info.plistREVERSED_CLIENT_ID 的值。 serverClientID 使用来自 Google Console 的对应值。

【讨论】:

是否需要[GGLContext configureWithError]?是否需要 @"email"@"profile" 范围? (shouldFetchBasicProfile 不会自动添加这些吗?)【参考方案4】:

您需要确保设置了[GIDSignIn sharedInstance].serverClientID 属性;该值可以在 Google API 控制台中找到。

此外,如果您获得了带有 nil 值的 user.serverAuthCode,请确保在任何后续尝试之前调用了 [[GIDSignIn sharedInstance] signOut];。否则[GIDSignIn sharedInstance] 好像记得以前的配置。

在模拟器中获取serverAuthCode 没有问题。

【讨论】:

signOut 部分有效。在尝试新代码之前,请务必退出。【参考方案5】:

改为从user 获取访问令牌:

NNString* accessToken = user.authentication.accessToken;

【讨论】:

你确定服务器授权码和访问令牌是一样的吗? @IulianOnofrei 您正在使用身份验证代码在服务器端获取访问令牌,对吧?为什么不直接使用访问令牌。【参考方案6】:

遇到了同样的问题。 GIDSignIn.sharedInstance().serverClientIDGIDSignIn.sharedInstance().clientID 相同。 也可以通过设置serverClientId 来解决。

【讨论】:

以上是关于Objective-C 中的 Google 用户 serverAuthCode nil的主要内容,如果未能解决你的问题,请参考以下文章

用于 Google Places API 的 Objective-C + JSON Parse objectForKey

从C语言的变量声明到Objective-C中的Block语法

读Google Objective-C Style Guide 有感想

Objective-C 中的 NSBundle 沙盒

根据用户选择将 UIPickerView 中的数据保存在 NSUserDefaults 中,并在另一个 ViewController Objective-C 中调用

具有不同角色的实时多人 Google Play 游戏