強まっていこう

あっちゃこっちゃへ強まっていくためのブログです。

Google OAuth を Google 純正の PHP ライブラリを使っての実装メモ

フルコーディングしちゃってるサンプルが WEB に散見されるが便利なライブラリがあるのでそれを使って幸せになるためのメモ。

今のところベータらしいのでそう言うのが嫌なら使わない方が幸せかもしれない。

クライアントIDとシークレットを取得

qiita.com

ここを参考に。

認証情報から JSON(client_secrets.json) をダウンロードしておくこと。

ライブラリ取得

composer require google/apiclient

git から入れたければ

github.com

ちなみに PHP 5.4.0 以上のみ対応。

サンプルコード

<?

require_once __DIR__ . '/../vendor/autoload.php';

$self = "https://{$_SERVER['HTTP_HOST']}/test/oauth.php";
$success = "$self?mode=success";
$secretsJson = '../client_secrets.json';

$p = $_GET;
$mode = @$p['mode'];

$client = new Google_Client();
$client->setAuthConfig($secretsJson);
$client->addScope(Google_Service_Plus::USERINFO_PROFILE);
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->setRedirectUri($success);
$authUrl = $client->createAuthUrl();
echo "<p><a href='$authUrl'>Auth</a> <a href='$self?mode=clear'>Clear session</a></p>";
echo "<pre>";

session_start();

if ($mode == 'clear') {
  $_SESSION['accessToken'] = '';
}
elseif ($mode == 'success') {
  echo "<p>SUCCESS: {$p['code']}</p>";
  $client->authenticate($p['code']);
  $accessToken = $client->getAccessToken();
  if ($accessToken) { $_SESSION['accessToken'] = $accessToken; }
}

if (@$_SESSION['accessToken']) {
  var_export($_SESSION['accessToken']);
  $client->setAccessToken($_SESSION['accessToken']);
  $plus = new Google_Service_Plus($client);
  $me = $plus->people->get('me');
  echo "<p><img src='{$me['image']['url']}'></p>";
  echo "<p>NAME: {$me['displayName']}</p>";
  echo "<p>GENDER: {$me['gender']}</p>";
  echo "<p>BIRTHDAY: {$me['birthday']}</p>";
  echo "<p>URL: {$me['url']}</p>";
}

echo "</pre>";

Auth のリンクを押すと OAuth の認証に行って結果のトークンをセッションに入れてユーザーのプロフィールを表示するコード。

ユーザープロフィール取得のために Developer Console のサービスの有効化で「Google+ API」を有効化させておくこと。

Clear session を押すとセッションをふっとばす。

$self は自分自身の URL。$success は認証が通った後の飛び先。この URL はデベロッパーコンソールの認証情報で、承認済みリダイレクト URI に登録しておくこと。

client_secrets.json はコンソールから DL したもの。わかっちゃいると思うけどこのファイルは WEB からアクセスできるようなところに置いちゃダメ。

<?
$client->addScope(Google_Service_Plus::USERINFO_PROFILE);

これはプロフィールを取得しまっせと言う宣言。何を取得するかによって変える。これにより認証時○○の情報にアクセスしようとしています、みたいなアレが出る。

<?
$this->setAccessType('offline');
$this->setApprovalPrompt('force');

トークンをリフレッシュさせるために必要です。これをやっておかないとトークンが1時間で無効になります。

<?
$authUrl = $client->createAuthUrl();

Google 側の認証用 URL を吐き出す。

<?
$client->authenticate($p['code']);
$accessToken = $client->getAccessToken();

認証成功後のコールバックには code が渡ってくる。これを元にトークンを取得。

<?
$client->setAccessToken($_SESSION['accessToken']);
$plus = new Google_Service_Plus($client);
$me = $plus->people->get('me');
echo "<p><img src='{$me['image']['url']}'></p>";
echo "<p>NAME: {$me['displayName']}</p>";
echo "<p>GENDER: {$me['gender']}</p>";
echo "<p>BIRTHDAY: {$me['birthday']}</p>";
echo "<p>URL: {$me['url']}</p>";

トークンを仕込んで、API を叩く。ここでは Google Plus の API を叩いてプロフィールを取得してる。

<?
$me = $plus->people->get('me', [ 'filter' => 'image' ]);

で取得する値を若干絞れたりもするけど、そんなに厳密には絞れなかったりする。

プロフィールの値に関しては

https://developers.google.com/+/web/api/rest/latest/people#resourcedevelopers.google.com

後はここを参考にファイト!

その他の API を叩きたい場合はそれぞれ API ごとのリファレンスを参照すると良し。ライブラリのコードを読むのが手っ取り早いかも。

ボタン用アイコン

日本語の物が無かったので作ったものを置いておく。