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

jQuery Mobileでページ内アンカーと外部からのアンカー

ほとんど触ったことのない『jQuery Mobile』ですが、少し触る機会がありました。 ハッシュタグを使ったアンカーで、通常はハッシュタグで指定の箇所へページ内アンカーとして動くのですが、jQuer …

no image

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

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

no image

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

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

no image

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

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

記事を探す