PHPでGoogleのOAuthを試してみる

CentOSにPHPのとりあえずの開発環境を作成してみる
の続き

PHPGoogleのOAuthを試してみる。

【参考】
Google OAuth + PHP でログイン処理の実装
http://temog.info/archives/programming/google-oauth-php.html

OAuth2.0でGoogleに接続するphpエージェントを作る(2) | ペンクおじさんのエンジニアブログ - Penq Inc.
http://penq.co.jp/blog/engineer/oauth2-0/2978

VirtualBoxのマシンのIPアドレスは「192.168.56.101」になってます。

VirtualBoxの設定

VirtualBoxの設定でポートフォワーディングを設定し、

http://localhost:8080/http://192.168.56.101/

のようにアクセスするようにしておく。

[ネットワーク]-[アダプター1]-[ポートフォワーディング]

GoogleのOAuthでは、プライベートなIPアドレスだとエラーになったが、localhostだとうまくいった。
また、自分のMacでは
http://localhost/http://192.168.56.101/
ではなぜかアクセスできなかったが、8080からだとアクセスできた。

そのため、上記するようにした。
なぜ駄目だったのかはよく分からない。

アプリケーションの登録

下記のページにアクセスして、プロジェクトを作成する。
https://code.google.com/apis/console/

左のメニューの[Credentials]を選択して、クライアントIDを作成する。

サイトのURLとコールバック用のURLを設定する。

「Client ID」と「Client secret」を控えておく。

あと、左のメニューの[Content screen]を選択して、
[EMAIL ADDRESS]と[PRODUCT NAME]を設定する。

この設定をしておかないと、下記のエラーが出る。

Error: invalid_client
no application name

サンプルプログラムの作成

index.php
<?php
// アプリケーション設定
define('CONSUMER_KEY', '(控えておいたClient IDを設定する)');
define('CALLBACK_URL', 'http://localhost:8080/callback.php');

// URL
define('AUTH_URL', 'https://accounts.google.com/o/oauth2/auth');


//--------------------------------------
// 認証ページにリダイレクト
//--------------------------------------
$params = array(
	'client_id' => CONSUMER_KEY,
	'redirect_uri' => CALLBACK_URL,
	'scope' => 'openid profile email',
	'response_type' => 'code',
);

// リダイレクト
header("Location: " . AUTH_URL . '?' . http_build_query($params));
callback.php
<?php
// アプリケーション設定
define('CONSUMER_KEY', '(控えておいたClient IDを設定する)');
define('CONSUMER_SECRET', '(控えておいたClient secretを設定する');
define('CALLBACK_URL', 'http://localhost:8080/callback.php');

// URL
define('TOKEN_URL', 'https://accounts.google.com/o/oauth2/token');
define('INFO_URL', 'https://www.googleapis.com/oauth2/v1/userinfo');


//--------------------------------------
// アクセストークンの取得
//--------------------------------------
$params = array(
	'code' => $_GET['code'],
	'grant_type' => 'authorization_code',
	'redirect_uri' => CALLBACK_URL,
	'client_id' => CONSUMER_KEY,
	'client_secret' => CONSUMER_SECRET,
);

// POST送信
$options = array('http' => array(
	'method' => 'POST',
	'content' => http_build_query($params)
));
$res = file_get_contents(TOKEN_URL, false, stream_context_create($options));

// レスポンス取得
$token = json_decode($res, true);
if(isset($token['error'])){
	echo 'エラー発生';
	exit;
}
$access_token = $token['access_token'];


//--------------------------------------
// ユーザー情報を取得してみる
//--------------------------------------
$params = array('access_token' => $access_token);
$res = file_get_contents(INFO_URL . '?' . http_build_query($params));
echo "<pre>" . print_r(json_decode($res, true), true) . "</pre>";

サンプルプログラムの確認

http://localhost:8080/
にアクセスすると、下記の画面が表示される。

[承認する]をクリックすると、
http://localhost:8080/callback.php
が呼ばれ、ユーザー情報が表示される。