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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

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

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

no image

get_postsでカスタムフィールドにチェックボックスを使っていた場合

WordPressのプラグイン「Advanced Custom Fields」を使ってカスタムフィールを使い、表示するかしないかの判定をするために、フィールドタイプをチェックボックスにしてカスタムフィ …

no image

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

前回はテンプレートファイルのカスタマイズをしたのでその続きから始めます。 Classファイルの修正 ディレクトリ内の『data/class/』に各種クラスファイルが保存されています。修正や追加をする場 …

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

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

no image

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

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

記事を探す