Google の OAuth 2.0 API は認証と認可の両方に使用でき、その実装は、OpenID Connectの仕様に準拠しています。
シングルサインオンについては、10年くらい前インフラ構築のプロジェクトでよく扱っていましたが、復習する目的でまずはOpenIDについて実際に動かしてみました。
まず最初にGoogle Cloudの設定からです。
新しいプロジェクト作成後、Oauthの設定
アプリ名など必須項目の入力
スコープは特に設定せず
認証情報の新規作成でOauthクライアントIDを選択
リダイレクトURIの入力
(ドメイン名は、hostsに設定したものを使用した。ブラウザが認識できればOK)
作成するとIDとシークレットコードが表示される
auth.phpをリクエストするとログイン画面が表示される
(リダイレクトURLが設定したものを一致しないなど、設定に不備があると不正リクエストと表示される)
ログインが成功するとユーザ情報が表示される
この後はセッション情報を書き込むなどしてアプリ固有の処理を継続する
リロードしたり認証が無効のとき情報が表示されない
ソースコードは下記を引用させていただきました。
https://pg.kdtk.net/421
auth.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?PHP $url = "https://accounts.google.com/o/oauth2/auth"; $client_id = "44********.apps.googleusercontent.com"; $redirect_uri = "http://decode2.red/oid/hello.php"; $query = ""; $query .= "client_id=" . urlencode( $client_id ) . "&"; $query .= "scope=" . urlencode( "openid email" ) . "&"; $query .= "response_type=" . urlencode( "code" ) . "&"; $query .= "redirect_uri=" . urlencode( $redirect_uri ) . "&"; $location = $url . "?" . $query; header("Location: {$location}"); ?> |
hello.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?PHP $url = "https://accounts.google.com/o/oauth2/token"; $client_id = "44********.apps.googleusercontent.com"; $client_secret = "GOCSPX-*******"; $redirect_uri = "http://decode2.red/oid/hello.php"; $query = ""; $query .= "code=" . urlencode( $_GET["code"] ) . "&"; $query .= "client_id=" . urlencode( $client_id ) . "&"; $query .= "client_secret=" . urlencode( $client_secret ) . "&"; $query .= "redirect_uri=" . urlencode( $redirect_uri ) . "&"; $query .= "grant_type=" . urlencode( "authorization_code" ); $header = array( "Content-Type: application/x-www-form-urlencoded", "Content-Length: ".strlen($query) ); $context = array( "http" => array( "method" => "POST", "header" => implode("\r\n", $header), "content" => $query ) ); $res_json = file_get_contents( $url, false, stream_context_create($context) ); $res = json_decode($res_json); $val = explode(".", $res->id_token); $data_json = base64_decode($val[1]); $data = json_decode($data_json); echo("<center> Hello! <br>"); print( "sub: ". $data->sub ."<br>" ); print( "email: ". $data->email."<br>"); print( "email_verified: " . $data->email_verified); echo("</center>"); ?> |
リダイレクトについては、FireFoxの拡張機能の、HTTP Header Live を使うと確認しやすいです。
PHPは、HTTPプロトコルに関するコーディングがとてもしやすいとあらためて思いました。Javaのような言語では設定やコードボリューム、ファイル数など大きくなりがちですが、PHPはコンパクトです。もともとHTMLテキストベースのコーディングに特化していたこともありますが、セッション処理、文字コード、DBアクセスなどひととおりそろっており、Web,HTMLの基礎はPHPで学びました。
(JavaScriptコードをPHPで書くような芸当もできたりします)
サーバサイドの開発環境もできましたので、ここからいろいろと掘り下げていきたいと思っています。