Как выполнять аутентифицированные вызовы к конечным точкам Google Cloud из клиента iOS с помощью входа Google для iOS?

Я реализовал эти инструкции в своем приложении для iOS:

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

А эти в моем Google Cloud Endpoints 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)
    })
}

person Eliot    schedule 06.10.2015    source источник
comment
Я думаю, что здесь было бы полезно поделиться большим количеством вашего кода.   -  person Nick    schedule 09.10.2015
comment
Код входа ничем не отличается от того, что содержится в ваших документах, указанных выше, но я добавил свой клиентский код Cloud Endpoints.   -  person Eliot    schedule 09.10.2015
comment
Похоже, что клиентская библиотека Endpoints имеет собственные средства аутентификации, описанные в docs, и это может или не может пересекаться с процессом входа в Identity Toolkit. Однако я не уверен, что это возможно, и для определения этого потребуется некоторое исследование с вашей стороны. Возможно, вы можете вручную создать экземпляр объекта службы API, используя учетные данные (предположительно, токен аутентификации), которые вы получили в процессе входа?   -  person Nick    schedule 09.10.2015
comment
Это стало возможным благодаря входу в Google+. Разве команда Identity Toolkit в Google не поговорила с командой App Engine перед созданием этого?   -  person Eliot    schedule 10.10.2015
comment
В документах, на которые вы ссылаетесь для входа в Identity Toolkit. поток, вы можете найти ссылку на документ, описывающий как отправить идентификатор токен, полученный вашим обработчиком обратного вызова (``) на внутренний сервер (т.е. ваш модуль конечных точек) и используйте его для проверки пользователя.   -  person Nick    schedule 12.10.2015
comment
Документы по конечным точкам описывают процесс входа, который запрашивает области, указанные в Endpoints API, а не только базовую информацию о профиле пользователя, запрашиваемую процессом входа Identity Toolkit.   -  person Nick    schedule 12.10.2015
comment
Привет, я пытался пройти self.service.authorizer = GIDSignIn.sharedInstance().currentUser.authentication.fetcherAuthorizer(), но это не имело никакого значения. Не могли бы вы сказать, где я могу ошибаться?   -  person Yogi    schedule 03.01.2017


Ответы (2)


(Я отслеживал эту проблему в течение нескольких месяцев и, наконец, понял это...)

После того, как вы вошли в систему, возвращенный объект GIDGoogleUser имеет авторизатор, прикрепленный как: user.authentication.fetcherAuthorizer

Этот объект можно использовать в качестве авторизатора для службы конечных точек, и вроде бы все работает!

Тем не менее, если вы хотите сделать свое приложение более точным, следуйте подходу, изложенному на странице https://cloud.google.com/appengine/docs/java/endpoints/consume_ios вместо этого вы можете использовать GTMAppAuth, который, кажется, является более похожей заменой подхода GTMOAuth2 в этом примере.

person Codiak    schedule 01.12.2016
comment
Я не проверял, но поверю вам на слово! - person Eliot; 03.12.2016
comment
Привет, я пытался пройти self.service.authorizer = GIDSignIn.sharedInstance().currentUser.authentication.fetcherAuthorizer(), но это не имело никакого значения. Не могли бы вы сказать, где я могу ошибаться? - person Yogi; 03.01.2017
comment
Очень трудно сказать, учитывая столь мало контекста. Я смог сделать это в Objective C, и похоже, что вы используете Swift? (что не должно иметь значения). По крайней мере, в Objective C fetcherAuthorizer является переменной-членом, а не вызовом функции, так что, может быть, проблема в этом? Конечно, я ожидал, что это выдаст вам ошибку компилятора, так что, возможно, это тоже не так - я просто хватаюсь за соломинку. - person Codiak; 03.01.2017

В методе делегата GIDSignIn "didSignIn for" просто добавьте

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

(Свифт 4)

person Hugo F    schedule 13.06.2018