Google setAccessToken, не знаю, что передать в качестве параметра - PullRequest
0 голосов
/ 26 декабря 2018

Я получаю свой токен доступа Google,

, и я установил его как

$client->setAccessToken($token)

Это работает для меня, и было в течение долгого времени.Я использовал его для вызовов API, и он работает.Однако я только недавно начал работать над новой функциональностью моего приложения.И я столкнулся с проблемой /..

Когда я хочу проверить, не истек ли этот токен, с помощью isAccessTokenExpired.

$client->isAccessTokenExpired()

Я получаю

undefined index : expires in

Iпогуглил, и, видимо, вам нужно передать всю строку в кодировке JSON в setAccessToken.НЕ ПРОСТО ЖЕТОК.(что странно, потому что почему только токен работает для вызовов API?)

Однако теперь, когда я это делаю ...

$token = json_decode($usersToken);
$client->setAccessToken($token);

Я получаю

Cannot use object of type stdClass as array

Затем я попытался преобразовать stdClass в массив

 $token = json_decode($usersToken, true);
 $client->setAccessToken($token);

И я получил

  Invalid Token Format   Client.php line 433

Какого черта я должен передать в setAccessToken, чтобы он был действительным???

И почему простая передача токена работает для вызовов API, но не проходит проверку срока действия.(очевидно, потому что мне нужен весь объект, а не просто строка токена) Но тогда как мне это сделать ??

Это поведение странное и нелогичное.

1 Ответ

0 голосов
/ 27 декабря 2018

Итак, основываясь на информации, которую вы имеете в своем вопросе, я сделаю предположение о вашей проблеме.Если это не поможет, я вернусь к этому вопросу после того, как вы опубликуете дополнительный код, чтобы мы могли на него посмотреть.

Ваш JSON-файл, содержащий маркер пользователя, должен выглядеть примерно так после того, как вы его декодируете:

$token = array(

'access_token'    => 'token value',
'expires_in'      => 3600,
'scope'           => 'a url specifying scope',
'token_type'      => 'Bearer',
'created'         => 'a timestamp for created date',
'refresh_token'  => 'refresh token value' 

);

Этот массив может быть передан в $client->setAccessToken($token) в виде массива.

Если вы считаете, что ваш скрипт вызывает только токен доступа, то:

$client->setAccessToken($token['access_token']);

Если вы запускаете $client->isAccessTokenExpired() и получаете сообщение об ошибке, подобное той, которую вы опубликовали в своем вопросе, можно предположить, что в вашем токене отсутствует поле expires_in и поле created.

isAccessTokenExpired() вернет ответ bool.Обратите внимание, что вы ничего не передаете в функцию, потому что $client уже должен иметь информацию, необходимую для проверки, истек ли токен.

Если ваш токен не имеет значений, которые я разместил вышевам нужно будет получить новый токен с соответствующими областями действия.

Общий процесс получения нового токена:

Взято из Краткое руководство по API Календаря Google - PHP

// If there is no previous token or it's expired.
    if ($client->isAccessTokenExpired()) {
        // Refresh the token if possible, else fetch a new one.
        if ($client->getRefreshToken()) {
            $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        } else {
            // Request authorization from the user.
            $authUrl = $client->createAuthUrl();
            printf("Open the following link in your browser:\n%s\n", $authUrl);
            print 'Enter verification code: ';
            $authCode = trim(fgets(STDIN));

            // Exchange authorization code for an access token.
            $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
            $client->setAccessToken($accessToken);

            // Check to see if there was an error.
            if (array_key_exists('error', $accessToken)) {
                throw new Exception(join(', ', $accessToken));
            }
        }
        // Save the token to a file.
        if (!file_exists(dirname($tokenPath))) {
            mkdir(dirname($tokenPath), 0700, true);
        }
        file_put_contents($tokenPath, json_encode($client->getAccessToken()));
    }

Убедитесь, что ваш клиентский объект установлен правильно:

$scopes = implode(' ', 

array(Google_Service_Calendar::CALENDAR)

);

$client = new Google_Client();
$client->setAuthConfig('path to credentials');  
$client->addScope($scopes);
$client->setAccessType('offline');

Также id_token и access_token - это не одно и то же.Вы должны прочитать разницу между ними.Поскольку вы не упомянули, что вы пытаетесь сделать или какие методы вы используете, все еще остается догадкой.

id_token против access_token

Надеюсь, что это может дать вам некоторое представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...