2

我已经在我的iOS应用中实现这些指令:如何使用iOS版Google帐户通过iOS客户端向Google Cloud Endpoints进行身份验证呼叫?

https://developers.google.com/identity/sign-in/ios/sign-in

而这些的人在我的谷歌云端点API:

https://cloud.google.com/appengine/docs/java/endpoints/consume_ios

除了我当然不这样做该位与GTMOAuth2ViewControllerTouch

两人不结婚。 iOS应用程序中的端点服务需要在其上设置授权程序,其中一个实现GTMFetcherAuthorizationProtocol。我在哪里可以从Google Sign-in回调中获得授权人?

AppDelegate的此回调传递一个GIDGoogleUser实例,该实例具有一个GIDAuthentication实例,该实例具有accessToken字段(String)。这就是我想要传递给App Engine的:

func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError!) { 
    log.debug("Access token: \(user.authentication.accessToken)") 
    // TODO: What do I do with this now? 
} 

以下是生成的服务需要令牌的位置。在我的情况下,API也没有很好的命名为只是“API”,因此产生的来源是GTLServiceApi,GTLQueryApi等

private func executeQuery(query: GTLQueryApi, completionBlock: (object: AnyObject!, error: NSError!) -> Void) -> Void { 
    let service = GTLServiceApi() 
    service.retryEnabled = true 

    // Whatever we set here should implement GTMFetcherAuthorizationProtocol. Where do we get one of those from the Google Sign-in SDK? 
    // service.authorizer = TODO 

    service.executeQuery(query, completionHandler: {(ticket, object, error) -> Void in 
     completionBlock(object: object, error: error) 
    }) 
} 
+0

我认为分享更多代码在这里会有所帮助 – Nick

+0

登录代码与上面链接的文档中的内容没有什么不同,但我添加了我的Cloud Endpoints客户端代码。 – Eliot

+0

似乎Endpoints客户端库有其自己的身份验证方法,这在[docs](https://cloud.google.com/appengine/docs/java/endpoints/consume_ios?hl=en)中进行了描述,并且这可能会或可能不会与Identity Toolkit登录流程重叠。我不确定是否有可能,但这需要一些研究来确定。可能您可以使用从登录流程中获得的凭据(可能是身份验证令牌)手动实例化API服务对象? – Nick

回答

1

(我一直在跟踪这个问题了几个月,终于想通了...)

一旦你登录,则GIDGoogleUser对象返回已在授权附加为: user.authentication.fetcherAuthorizer

这个对象可以被用作授权的终端服务,一切似乎工作!也就是说,如果您想让自己的应用更贴近地遵循https://cloud.google.com/appengine/docs/java/endpoints/consume_ios中的方法,您可以改为使用GTMAppAuth,这似乎是该例中GTMOAuth2方法更加类似设计的替代方案。

+0

我还没有检查过这个,但我会接受你的话! – Eliot

+0

嗨,我试着传递'self.service.authorizer = GIDSignIn.sharedInstance()。currentUser.authentication.fetcherAuthorizer()'但没有任何区别。你能告诉我哪里可能会出错吗? – Yogi

+0

这样的背景很难说。我可以在Objective C中做到这一点,它看起来像你在使用Swift? (这应该不重要)。至少在目标C中,fetcherAuthorizer是一个成员变量,而不是函数调用,所以也许这就是问题所在?当然,我希望能给你一个编译器错误,所以也许不是这样 - 我只是抓着吸管。 – Codiak

相关问题