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.serverAuthCode
是nil
,我需要将这个服务器验证码传递给,呃,在服务器上验证用户。
我阅读了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】:使用此配置获取不是nil
的serverAuthCode
:
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.plist
的REVERSED_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().serverClientID
与 GIDSignIn.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 有感想
根据用户选择将 UIPickerView 中的数据保存在 NSUserDefaults 中,并在另一个 ViewController Objective-C 中调用