FaMirror Project

報告的なこと、技術的なこと

GoogleのOAuth2.0を使ってプロフィールを取得【PHP】

概要

googlegoogle+gmailyoutubeなどのAPIを多数公開しています。
f:id:famirror:20151216145221p:plain

それを使う時に必要になるのがOAuth2.0での認証になります。

今回は、その認証を行い、プロフィール情報を取得します。

アプリケーション登録

OAuth2.0での認証を行うためには、アプリケーションの登録が必要になります。

まず、以下のページにアクセスして、googleアカウントでログインしてください。
console.developers.google.com

ログインができたら、「Google API」を利用すると書かれているところをクリックします。

以下のようなポップアップが表示されるので、プロジェクト名を入力して、利用規約に同意し、新しいプロジェクトを作成します。
f:id:famirror:20151216145714p:plain

左上のメニューボタンから「API Manager」のページに飛び、「認証情報」の画面から「OAuth同意画面」のタブを開いてください。

ユーザーに表示するサービス名を入力して、保存を押します。
f:id:famirror:20151216150517p:plain

以下のような画面に飛ぶので、「新しい認証情報」から「OAuthクライアントID」を選択します。
f:id:famirror:20151216150730p:plain

今回はPHPで情報を取得するので、「アプリケーションの種類」は「ウェブアプリケーション」、「承認済みのリダイレクトURL」は認証完了後に見せるページのURLを入力してください。
f:id:famirror:20151216151500p:plain

今回はlocalhostで試します。

作成のボタンを押すと、クライアントIDとクライアントシークレットが表示されるので、どこかにメモしておいてください。

認証用のPHPを書く

以下のようなPHPを書きます。

PHP(index.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));
?>

&ltクライアントID&gtはご自身のものをお使いください。

「CALLBACK_URL」には認証が終わった後に表示させたいページのURLを入れてください。

先ほど「承認済みのリダイレクトURL」で設定したものと同じURLになります。

この状態で、作成したPHPにアクセスすると、このようなプロフィール情報のリクエスト画面が表示されるはずです。
f:id:famirror:20151216152944p:plain

「$params」内の「scope」には、取得したい情報を設定します。

今回はプロフィールだけ取得したかったので「https://www.googleapis.com/auth/userinfo.profile」を設定しました。

メールアドレスも合わせて取得したい場合は、「$params」を以下のように書き換えてください。

PHP(index.php)変更

$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(oauth.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;
?>

&ltクライアントID&gtと&ltクライアントシークレット&gtはご自身のものを設定してください。

「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行目「//表示」以降を次のように書き換えてください。

PHP(oauth.php)変更

$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>

以下のような画面が表示されるはずです。
f:id:famirror:20151216160619p:plain

コード

PHP(index.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));
?>

PHP(oauth.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));

$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>