suzuboss.info

実際に使ってみた・試してみた経験が誰かの「かゆいところに手が届く」なら幸いです。

Web系

Google API OAuth 2.0のリフレッシュトークンでハマった

投稿日:2016/01/08 更新日:

WebアプリでGoogle Search ConsoleのAPIを使うにあたり、リフレッシュトークン関連でハマったのでメモしておきます。

アクセストークンの取得

特に何も考えずにアクセストークンを取得すると、PHPのコードはだいたい以下の感じになると思います。


$Client = new Google_Client();
$Client->setClientId('クライアントID');
$Client->setClientSecret('クライアント シークレット');
$Client->setRedirectUri('コールバック用URI');

$Client->addScope(Google_Service_Webmasters::WEBMASTERS_READONLY);
$Service = new Google_Service_Webmasters($Client);

if (isset($_GET['code'])) {
	// トークン取得
	$Client->authenticate($_GET['code']);
	// トークンをセッションに保存
	$_SESSION['access_token'] = $Client->getAccessToken();
	// リダイレクト先を設定
	header('Location: 任意のURL');
	exit;
}

if (isset($_SESSION['access_token'])) {
	// 認証トークンをセット
	$Client->setAccessToken($_SESSION['access_token']);
}

問題なく認証されれば「$_SESSION[‘access_token’]」にJSONで返ってきた認証トークンの情報が入っているのですが、リフレッシュトークンは空でした。このリフレッシュトークンがなければまた認証からやり直すことになります。

リフレッシュトークンを取得するにはパラメータが必要

調べてわかったことはクエリのパラメータを指定する必要があるみたいです。

  • approval_prompt=force : 認可画面をスキップさせない。
  • access_type=offline : オフラインでAPIを使う

リフレッシュトークンを使って再取得

修正したコードは以下の感じとなりました。


$Client = new Google_Client();
$Client->setClientId('クライアントID');
$Client->setClientSecret('クライアント シークレット');
$Client->setRedirectUri('コールバック用URI');

//【追加】リフレッシュトークン用に設定
$Client->setApprovalPrompt('force');
$Client->setAccessType('offline');

$Client->addScope(Google_Service_Webmasters::WEBMASTERS_READONLY);
$Service = new Google_Service_Webmasters($Client);

if (isset($_GET['code'])) {
	// トークン取得
	$Client->authenticate($_GET['code']);
	// トークンをセッションに保存
	$_SESSION['access_token'] = $Client->getAccessToken();
	// リダイレクト先を設定
	header('Location: 任意のURL');
	exit;
}

if (isset($_SESSION['access_token'])) {

	// 認証トークンをセット
	$Client->setAccessToken($_SESSION['access_token']);

	//【追加】リフレッシュトークンの取得
	$token = json_decode($_SESSION['access_token']);
	if($token->refresh_token){
		$token_now = time();
		$token_exp = $token->created + $token->expires_in - 1000;	//単位は秒
		//有効期限を見てトークンリフレッシュ
		if($token_now >= $token_exp) {
			$Client->refreshToken($token->refresh_token);
			$_SESSION['access_token'] = $Client->getAccessToken();
		}
	}

}

これで無事にリフレッシュトークンを取得し、認証トークンを再発行することができました。あとはアクセスするたびに期限をチェックするのか、Ajaxでハートビートするなどして認証が切れないようにAPIを利用することが出来そうです。

参考になれば幸いです。

-Web系

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

Logicool C310(V-U0015)をSkypeで使ってみた

在宅の方と仕事をする際にSkypeを使っています。顔を見ながら話せると電話よりも伝わるのでいいですよね。 デスクトップでSkypeを使う時にはWebカメラを利用しています。使っているのはロジクールの「 …

no image

Google Chartsを使った簡単な折れ線グラフ

時々ですが、Webページにグラフを埋め込む必要があったりする場面があります。検索をすればサンプルはたくさんできてくるので大変ありがたい所です。使うライブラリとしては「Google Charts」と「C …

no image

EC-CUBEで規格以外に項目を追加した①

試行錯誤の末に問題なく動作するようになったと思うので、メモ的に残しておきます。 利用したEC-CUBEのバージョンは『2.13.2』です。テンプレートは『EC-CUBE on Bootstrap3』に …

no image

EC-CUBEで規格以外に項目を追加した③

前回はフロント側のクラスまわりをカスタマイズしたのでその続きから始めます。 受注管理あたりをカスタマイズすることになります。

no image

リンク画像をロールオーバーでクロスフェードさせる

jQuery v1.10.2で動いています。 aタグに含まれた画像のフェードタイプのロールオーバーです。画像のファイル名の末尾には「_on」「_off」をつけておきます。aタグ内に画像もテキストも含ま …

記事を探す