フィンテック関連の会社さんの接続評価をする際に、OAuth での認証が必要だったので、久し振りに OAuth を弄ってみた顛末の備忘録
やっぱり、Google 先生に聞くと Google 先生の コンソールでの動作例が多いので例に倣って Google 先生のコンソールで テスト用の API を作って動作確認をしてみた
だけど、ownCloud の時と同様に、コンソールのスナップショットとかが古い物しか出てこなくて、少し苦労したので新しめのスナップショットを晒してみよう…
1.プロジェクトの作成
https://console.developers.google.com/project
ここから、プロジェクトの作成 を選択して行けば良いと思う
OAuth Test と言う、まごう事なきプロジェクト名を付けてみた
細かいところは端折っているのけど、ownCloud のあたりとダブっているので割愛
作成すると↓こんな感じになると思うので、青い「Google API を利用する」を選択する
上のメニューバーや「プロジェクト:OAuth Test」 となっていることを確認して、「Google API を利用する」 を選択すると
こんな感じのページに推移する
次に設定を行うので、左ペインの「認証情報」を選択する
こんな感じのページに推移するので、認証情報の三つのタブを設定してみる
2.認証に必要な情報
認証情報のクライアントのリストにある「名前」をクリックすると、詳細な情報のページに推移します
コレが重要な情報です
OAuth を呼ぶときには、まず、Client ID と、Callback URI が必要です
OAuth のパスワードとかが問題なければ、ソコに情報を持って推移してきてくれます
コールの際にも コールバック URI を指定しますので、デフォルトの戻り位置かな?
詳細は OAuth の仕様で確認すれば良いよね!
それと、Client Secret は、コールバック先の応答で必要に成るので書いてある場所を忘れないようにしないとね!
「保存」を選択するとローカルにテキストファイルの形式で保管できるのでお勧め!
3.OAuth の呼び方
必要なパラメーターを REST 式に用意して GET メソッドでコールすれば良いんだけど、
<a href="https://accounts.google.com/o/oauth2/auth?……" …..
コール先はこんな感じ、必要なパラメーターは、
response_type は code に固定
scope は、 profile email
redirect_uri と、client_id は、前にある認証情報から拾ってこれるので、間違わないように入力する!
何度も何度も URI をアドレスバーに入力するのは面倒なので PHP で書いてみるとこんな感じ
<?php
define('CLIENT_ID', '5612..........kk.apps.googleusercontent.com');
define('CALLBACK', 'https://XXXXXXXXXX.co.jp/XX/callback.php');
//define('CALLBACK', 'urn:ietf:wg:oauth:2.0:oob');
$baseURL = 'https://accounts.google.com/o/oauth2/auth?';
// 認証用URL生成
$params = array(
'scope' => 'profile email' ,
'redirect_uri' => CALLBACK ,
'response_type'=> 'code',
'client_id' => CLIENT_ID
);
$authURL = $baseURL . http_build_query($params,'','&',PHP_QUERY_RFC3986);
//echo $authURL;exit;
// Redirect
header("Location: " . $authURL);
?>
このソースにアクセスすると、見慣れた Google 先生のログイン画面になるので、認証情報を確認してログインすれば良い!
問題なければ、自動的に callback uri へ飛んできます
4. コールバック先の用意
Google 先生が返してくれる情報は 上のソースの scope で指定された範囲で帰ってきます
この情報は、コールバック先で読み込みますので、コールバック先を用意します
このソースは …../XX/callback.php に相当します
<?php
// アプリケーション設定
define('CONSUMER_KEY', '5612.........kk.apps.googleusercontent.com');
define('CONSUMER_SECRET', 'V................i');
define('CALLBACK_URL', 'https://XXXXXXXXXX.co.jp/XX/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(
'grant_type' => 'authorization_code',
'client_id' => CLIENT_ID,
'client_secret' => CLIENT_SECRET,
'redirect_uri' => CALLBACK_URL,
'code' => $_GET['code'],
);
// ヘッダー準備
$headers = array(
'Content-Type: application/x-www-form-urlencoded',
'Content-Length: '.strlen(http_build_query($params))
);
// コンテキスト準備
$options = array(
'http' => array(
'method' => 'POST',
'ignore_errors' => true,
'content' => http_build_query($params),
'header' => implode("\r\n",$headers)
)
);
// 取得
$res = file_get_contents(TOKEN_URL, false, stream_context_create($options));
// レスポンス確認
$token = json_decode($res, true);
if(isset($token['error'])){
echo 'json error';
exit;
}
// アクセストークン取得
$access_token = $token['access_token'];
// token echo
echo 'token='.$access_token."<br />\n";
echo 'code='.$_REQUEST['code']."<br />\n";
//exit;
// プロフィール取得
// 引数準備
$params = array(
// 'access_token' => $access_token,
);
// ヘッダー準備
$headers = array(
'Content-Type: application/x-www-form-urlencoded',
'Authorization: Bearer '.$access_token,
'X-Api-Key: '.CLIENT_ID,
'locale: ja_JP',
'Content-Length: '.strlen(http_build_query($params))
);
// コンテキスト準備
$options = array(
'http'=> array(
'method' => 'GET',
'ignore_errors' => true,
'content' => http_build_query($params),
'header' => implode("\r\n",$headers)
)
);
// 取得
$res = file_get_contents(INFO_URL, false,stream_context_create($options));
echo "<pre>" .print_r(json_decode($res, true), true) . "</pre>";
こんな感じかな?
ポイント!
- 最初に 引数 code を使って、アクセストークン を取得する
- https を file_get_contents で取り込む際に ignore_errors を指定しないとエラーや警告が出る
- GET と POST のメソッドで読んでみた例
- ヘッダーの Authorization: Bearer でトークンを渡す
こんな感じかな?