如何使用 Google 登录 iOS 从 iOS 客户端对 Google Cloud Endpoints 进行经过身份验证的调用?

How do I make authenticated calls to Google Cloud Endpoints from an iOS client using Google Sign-in for iOS?

我已经在我的 iOS 应用程序中实施了这些说明:

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

这些在我的 Google 云端点 API:

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

除了我当然不使用 GTMOAuth2ViewControllerTouch

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

AppDelegate 上的这个回调传递了一个 GIDGoogleUser 实例,它有一个 GIDAuthentication 实例,它有一个 accessToken 字段(字符串)。这就是我想传递给 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)
    })
}

(我跟踪这个问题好几个月了,终于弄明白了...)

登录后,返回的 GIDGoogleUser 对象附有授权方: user.authentication.fetcherAuthorizer

此对象可用作端点服务的授权方,一切似乎都正常!

就是说,如果您想让您的应用更严格地遵循 https://cloud.google.com/appengine/docs/java/endpoints/consume_ios, you might instead use GTMAppAuth 中列出的方法,这似乎是该示例中设计更相似的 GTMOAuth2 方法的替代方法。

在 GIDSignIn 委托方法中 "didSignIn for" 只需添加

let authorizer = user.authentication.fetcherAuthorizer()
self.service.authorizer = authorizer

(Swift 4)