GoogleのOAuth2.0を使ってプロフィールを取得【PHP】
概要
googleはgoogle+やgmail、youtubeなどのAPIを多数公開しています。
それを使う時に必要になるのがOAuth2.0での認証になります。
今回は、その認証を行い、プロフィール情報を取得します。
アプリケーション登録
OAuth2.0での認証を行うためには、アプリケーションの登録が必要になります。
まず、以下のページにアクセスして、googleアカウントでログインしてください。
console.developers.google.com
ログインができたら、「Google API」を利用すると書かれているところをクリックします。
以下のようなポップアップが表示されるので、プロジェクト名を入力して、利用規約に同意し、新しいプロジェクトを作成します。
左上のメニューボタンから「API Manager」のページに飛び、「認証情報」の画面から「OAuth同意画面」のタブを開いてください。
ユーザーに表示するサービス名を入力して、保存を押します。
以下のような画面に飛ぶので、「新しい認証情報」から「OAuthクライアントID」を選択します。
今回はPHPで情報を取得するので、「アプリケーションの種類」は「ウェブアプリケーション」、「承認済みのリダイレクトURL」は認証完了後に見せるページのURLを入力してください。
今回はlocalhostで試します。
作成のボタンを押すと、クライアントIDとクライアントシークレットが表示されるので、どこかにメモしておいてください。
認証用のPHPを書く
以下のようなPHPを書きます。
<?php // アプリケーション設定 define('CONSUMER_KEY', '<クライアントID>'); define('CALLBACK_URL', 'http://localhost/test/oauth.php'); // URL define('AUTH_URL', 'https://accounts.google.com/o/oauth2/auth'); $params = array( 'client_id' => CONSUMER_KEY, 'redirect_uri' => CALLBACK_URL, 'scope' => 'https://www.googleapis.com/auth/userinfo.profile', 'response_type' => 'code', ); // 認証ページにリダイレクト header("Location: " . AUTH_URL . '?' . http_build_query($params)); ?>
<クライアントID>はご自身のものをお使いください。
「CALLBACK_URL」には認証が終わった後に表示させたいページのURLを入れてください。
先ほど「承認済みのリダイレクトURL」で設定したものと同じURLになります。
この状態で、作成したPHPにアクセスすると、このようなプロフィール情報のリクエスト画面が表示されるはずです。
「$params」内の「scope」には、取得したい情報を設定します。
今回はプロフィールだけ取得したかったので「https://www.googleapis.com/auth/userinfo.profile」を設定しました。
メールアドレスも合わせて取得したい場合は、「$params」を以下のように書き換えてください。
$params = array( 'client_id' => CONSUMER_KEY, 'redirect_uri' => CALLBACK_URL, 'scope' => 'https://www.googleapis.com/auth/userinfo.profile email', 'response_type' => 'code', );
認証完了後用のPHPを書く
手順としては、認証が完了すると一時的なコードがもらえるので、それをPOST送信してアクセストークンと呼ばれるキーを取得します。
アクセストークンをGET送信することによって、ユーザーのプロフィール情報を取得することができます。
アクセストークンの有効期限は30分ほとです。
次のようなPHPファイルを作成してください。
<?php // アプリケーション設定 define('CONSUMER_KEY', '<クライアントID>'); define('CONSUMER_SECRET', '<クライアント シークレット>'); define('CALLBACK_URL', 'http://localhost/test/oauth.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 $res; ?>
<クライアントID>と<クライアントシークレット>はご自身のものを設定してください。
「CALLBACK_URL」に関しても、先ほどと同じです。
これで、もう一度「index.php」にアクセスしてログインすると、次のようなJSONが出力されたと思います。
{ "id": "100441683881475077870", "name": "Project FaMirror", "given_name": "Project", "family_name": "FaMirror", "picture": "https://lh3.googleusercontent.com/-XdUIqdMkCWA/AAAAAAAAAAI/AAAAAAAAAAA/4252rscbv5M/photo.jpg", "locale": "ja" }
結果の表示
結果がjson形式のままでは寂しいので、少し体裁を整えてみます。
oauth.phpの42行目「//表示」以降を次のように書き換えてください。
$result = json_decode($res, true); ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="style.css"> <title>GoogleのOAuth2.0を使ってプロフィールを取得</title> </head> <body> <h2>ユーザー情報</h2> <table> <tr><td>ID</td><td><?php echo $result['id']; ?></td></tr> <tr><td>ユーザー名</td><td><?php echo $result['name']; ?></td></tr> <tr><td>苗字</td><td><?php echo $result['family_name']; ?></td></tr> <tr><td>名前</td><td><?php echo $result['given_name']; ?></td></tr> <tr><td>場所</td><td><?php echo $result['locale']; ?></td></tr> </table> <h2>プロフィール画像</h2> <img src="<?php echo $result['picture']; ?>" width="100"> </body> </html>
以下のような画面が表示されるはずです。
コード
<?php // アプリケーション設定 define('CONSUMER_KEY', '<クライアントID>'); define('CALLBACK_URL', 'http://localhost/test/oauth.php'); // URL define('AUTH_URL', 'https://accounts.google.com/o/oauth2/auth'); $params = array( 'client_id' => CONSUMER_KEY, 'redirect_uri' => CALLBACK_URL, 'scope' => 'https://www.googleapis.com/auth/userinfo.profile', 'response_type' => 'code', ); // 認証ページにリダイレクト header("Location: " . AUTH_URL . '?' . http_build_query($params)); ?>
<?php // アプリケーション設定 define('CONSUMER_KEY', '<クライアントID>'); define('CONSUMER_SECRET', '<クライアントシークレット>'); define('CALLBACK_URL', 'http://localhost/test/oauth.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)); $result = json_decode($res, true); ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="style.css"> <title>GoogleのOAuth2.0を使ってプロフィールを取得</title> </head> <body> <h2>ユーザー情報</h2> <table> <tr><td>ID</td><td><?php echo $result['id']; ?></td></tr> <tr><td>ユーザー名</td><td><?php echo $result['name']; ?></td></tr> <tr><td>苗字</td><td><?php echo $result['family_name']; ?></td></tr> <tr><td>名前</td><td><?php echo $result['given_name']; ?></td></tr> <tr><td>場所</td><td><?php echo $result['locale']; ?></td></tr> </table> <h2>プロフィール画像</h2> <img src="<?php echo $result['picture']; ?>" width="100"> </body> </html>