PHPでGoogleのOAuthを試してみる
CentOSにPHPのとりあえずの開発環境を作成してみる
の続き
【参考】 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を作成する。
「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
が呼ばれ、ユーザー情報が表示される。