ログインフレームワークとして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();
}
私と同じような問題を検索しようとしましたが、見つかりませんでした。これは昨日から起こった。これまでは、コードを変更することはありませんでした。
彼のコメントにより、Fabian Parzefallはこれを修正するのに役立ちました。
これが私のスクリプトです:
if($client->isAccessTokenExpired()) {
$authUrl = $client->createAuthUrl();
header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
}
それは実際にはかなり簡単です。 GA APIチーム)が提供するデモスクリプトのように、「接続」ボタンをクリックするように依頼する代わりに、直接リダイレクトします。それが適切で安全な方法かどうかはわかりません、しかしそれは今私のために働いているものです!
if($client->isAccessTokenExpired()) {
$client->authenticate();
$NewAccessToken = json_decode($client->getAccessToken());
$client->refreshToken($NewAccessToken->refresh_token);
}
上記の答えは「正しい」ですが、どこに配置するかを検討するのに苦労しました(!)...トークンが期限切れになる(!).
コードが必要なトークンをすべて実行し、クライアントがアクセストークンを取得したら...それが有効であることを確認し、そうでない場合は再認証のために送信します。
// 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{
...
}