web-dev-qa-db-ja.com

OAuth 2.0アクセストークンの有効期限が切れているため、更新トークンを使用できません

ログインフレームワークとしてGoogle OAuth2.0を使用するWebベースのアプリケーションがあります。以前は昨日までうまくいきました。アクセストークンの有効期限が切れた後、アプリケーションは更新トークンを取得できませんでした。さらに、「許可のリクエスト」ページは、「Googleにいるユーザーを知る」や「メールを表示する」ではなく、「オフラインアクセスを許可する」に変更されました。

当初、[許可のリクエスト]ページでは、[Googleにアクセスしていることを確認]および[メールを表示]へのアクセスがリクエストされます。ユーザーがログアウトして2回目のログインを試みた後、「許可のリクエスト」ページも同じになります。

ただし、昨日までは、[許可のリクエスト]ページが[オフラインアクセス]に変更されていました。アクセストークンの有効期限が切れると、以下のエラーメッセージが表示されます。

PHPの致命的なエラー:キャッチされない例外「Google_AuthException」とメッセージ「OAuth 2.0アクセストークンの有効期限が切れているため、更新トークンを使用できません。自動承認された応答に対して更新トークンが返されません。 '/home2/xxxx/public_html/test/google-api-php-client/src/auth/Google_OAuth2.php:221

$client->setAccessType('online');を試してみました。ただし、この致命的なエラーが発生しました。以下は、アクセストークンを取得するためのコードです。

    if ($client->getAccessToken()) {
      $token = $client->getAccessToken();
      $authObj = json_decode($token);
      $refreshToken = $authObj->refresh_token;
      $user = $oauth2->userinfo->get();
      $me = $plus->people->get('me');
      $email = filter_var($user['email'], FILTER_SANITIZE_EMAIL); // get the USER EMAIL ADDRESS using OAuth2

      $optParams = array('maxResults' => 100);
      $activities = $plus->activities->listActivities('me', 'public', $optParams);


      $_SESSION['access_token'] = $client->getAccessToken();
    } else {
      $authUrl = $client->createAuthUrl();
    }

私と同じような問題を検索しようとしましたが、見つかりませんでした。これは昨日から起こった。これまでは、コードを変更することはありませんでした。

17
CK Tan

彼のコメントにより、Fabian Parzefallはこれを修正するのに役立ちました。

これが私のスクリプトです:

if($client->isAccessTokenExpired()) {

    $authUrl = $client->createAuthUrl();
    header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));

}

それは実際にはかなり簡単です。 GA APIチーム)が提供するデモスクリプトのように、「接続」ボタンをクリックするように依頼する代わりに、直接リダイレクトします。それが適切で安全な方法かどうかはわかりません、しかしそれは今私のために働いているものです!

18
Charles G.
  if($client->isAccessTokenExpired()) {

     $client->authenticate();
     $NewAccessToken = json_decode($client->getAccessToken());
     $client->refreshToken($NewAccessToken->refresh_token);

    }
3
CK Tan

上記の答えは「正しい」ですが、どこに配置するかを検討するのに苦労しました(!)...トークンが期限切れになる(!).

コードが必要なトークンをすべて実行し、クライアントがアクセストークンを取得したら...それが有効であることを確認し、そうでない場合は再認証のために送信します。

// Stuff to do with getting tokens and storing in session etc...

if ($client->getAccessToken()) { // Hey! we got one!
    if($client->isAccessTokenExpired()) { // Oh! its not good - go for another
        $authUrl = $client->createAuthUrl();
        header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
        exit();
    }
  try{
...
     }
2
pperrin