Hatena::ブログ(Diary)

yk5656 diary

記事一覧: Linux | Ansible | Swift | Ruby | PHP | JavaScript | MySQL | Git | Vim

2014-06-08(日)

PHPでGoogleのOAuthを試してみる

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

PHPでGoogleの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]-[ポートフォワーディング]
f:id:yk5656:20140629123356p:image:w500

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

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

アプリケーションの登録

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

左のメニューの[Credentials]を選択して、クライアントIDを作成する。
f:id:yk5656:20140629123605p:image:w400

サイトのURLとコールバック用のURLを設定する。
f:id:yk5656:20140629123604p:image:w400

「Client ID」と「Client secret」を控えておく。
f:id:yk5656:20140629123803p:image:w360

あと、左のメニューの[Content screen]を選択して、
[EMAIL ADDRESS]と[PRODUCT NAME]を設定する。
f:id:yk5656:20140629123802p:image:w360

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

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/
にアクセスすると、下記の画面が表示される。
f:id:yk5656:20140629123801p:image:w360

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

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/yk5656/20140608/1404012739