Ошибка "unauthorized_client" при использовании PHP-клиента для refreshToken с клиентом Google API? - PullRequest
0 голосов
/ 15 января 2019

Я запрашиваю доступ к данным пользователя из приложения IOS, используя этот код из модуля GoogleSignIn

 [GIDSignIn sharedInstance].uiDelegate = self;
 [[GIDSignIn sharedInstance] setScopes:@[ ... ];
 [[GIDSignIn sharedInstance] signInSilently];

Затем я получаю accessToken и refreshToken в appDelegate и отправляю это на сервер, работающий на PHP и использующий эту клиентскую библиотеку Google (https://github.com/googleapis/google-api-php-client) ... в течение первого часа все работает нормально и доступ токен действителен и разрешает мне доступ ко всем областям. Затем через час истекает срок действия токена доступа, и я пытаюсь обновить его, используя этот код

$client = new Google_Client();
$client->setApplicationName(<app name>);
$client->setDeveloperKey(<google_oauth_developer_key>);
$client->setClientSecret(<google_oauth_client_secret>);
$client->setClientId(<google_oauth_client_id>);
$client->refreshToken("1/12ju3ZZim-r6co195lIVNNvzBq9x5G64GJCWkYsOQ18");

и функция «refreshToken» выше возвращает эту ошибку

=> [
     "error" => "unauthorized_client",
     "error_description" => "Unauthorized",
   ]

Стоит отметить, что app name, google_oauth_developer_key, google_oauth_client_secret и google_oauth_client_id не изменились. Это те же самые, которые работали ранее для получения контактов пользователя, событий календаря и т. Д., Когда токен доступа еще не истек.

Что может быть причиной этой ошибки?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Хорошо, поэтому я понял, что я сделал не так. Первоначально я следовал этим инструкциям https://developers.google.com/identity/sign-in/ios/sign-in, которые предполагают, что вам нужен только онлайн-доступ, но на самом деле мне нужен автономный доступ к областям действия, поэтому я следовал этим инструкциям https://developers.google.com/identity/sign-in/ios/offline-access, и теперь это работает. Поэтому вместо того, чтобы приложение IOS отправляло токен доступа и токен обновления отдельно, как это

- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error {

    if (!error) {
        NSString *accessToken = user.authentication.accessToken;
        NSString *refreshToken = user.authentication.refreshToken;

Мне просто нужно отправить serverAuthCode вот так

- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error {

      if (!error) {
        NSString *serverAuthCode = user.serverAuthCode;

и затем на сервере я запускаю этот код для получения токена доступа

$access_token = $client->authenticate($google_server_auth_code);
$client->setAccessToken($access_token);

и затем, когда срок действия маркера доступа истекает, я запускаю его, чтобы обновить

$access_token = $client->refreshToken($client->getRefreshToken());
$client->setAccessToken($access_token);
0 голосов
/ 15 января 2019

В какой-то момент вам нужно использовать токен обновления.

if ($client->isAccessTokenExpired()) {
        $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        $client->getAccessToken();

Код извлечен из моего Oauth2Authentication.php образца

Примечание

Также помните, что токены обновления основаны на пользователях и клиентах. Поэтому, если токен был сгенерирован одним клиентом, другой клиент, вероятно, не сможет его использовать. Я буду очень удивлен, если вы сможете использовать токен обновления, созданный в коде Ios, в приложении php. Типы клиентов разные.

...