(あくまでも理解する為に作成したプラグラムなので実際に運用する場合はセキュリティーを十分に高める施策が必要です。)
大まかな手順としては、まずGoogleのクライアントIDを取得する必要があります。
「Google OpenID Connect」の為の「クライアントID」の取得方法については下記の記事を参考にしてください。
Googleの「OpenID Connect」を利用するにあたり、
まずは「Google Developers Console」より「クラ...
「クライアントID」を取得したら実際にPHPに実装して動作させる事が可能です。
大まかな仕組みは下記の図のようになります。
この図のServerがPHPのプログラムを実装するサーバーです。
図のオレンジ色のPHPが作成対象になります。
index.php | ボタン(リンク)を表示するだけのページ |
auth.php | 各種パラメタを設定してGoogleにリダイレクトするプログラム |
callback.php |
Googleの認証が完了した際にコールバックされるプログラム コールバックされた情報を元に詳細情報を取得処理も実行 ※クライアントIDを取得する際に設定した「設定した認証済みのリダイレクトURI」に対応するファイル名(ファイルパス)にする必要があります。 必要があればファイル名(ファイルパス)を修正するかGoogle Developers Consoleにて「設定した認証済みのリダイレクトURI」を設定(修正)して下さい。 |
それでは、各種コードを紹介していきます。
index.php
1 |
<a href="./auth.php">google openid connect login</a> |
「google openid connect login」というリンクが表示されるだけのページです。
続いてこのリンクから呼び出される「auth.php」のコードです。
auth.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 |
<?PHP //************** // 各種値の設定 //************** $url = "https://accounts.google.com/o/oauth2/auth"; $client_id = "[取得したクライアントID]"; $redirect_uri = "[設定した認証済みのリダイレクトURI]"; //---------------- // パラメタの設定 //---------------- $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}"); ?> |
先に取得した「クライアントID」と設定した「コールバックURL」を指定してGoogleのOAuthにリダイレクトするだけです。
そして最後にGoogleから実際に対象のデータを取得するコードです。
callback.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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
<?PHP //************** // 各種値の設定 //************** $url = "https://accounts.google.com/o/oauth2/token"; $client_id = "[取得したクライアントID]"; $client_secret = "[取得したクライアント シークレット]"; $redirect_uri = "[設定した認証済みのリダイレクトURI]"; //---------------------------------------- // POSTパラメータの作成 // コールバックの戻り値はGETで取得できる //---------------------------------------- $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" ); //-------------------- // HTTPヘッダーの設定 //-------------------- $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 ) ); //--------------------- // id token を取得する //--------------------- $res_json = file_get_contents( $url, false, stream_context_create($context) ); //---------------------------------- // 取得するデータを展開して表示する //---------------------------------- //取得したjsonデータをオブジェクト化 $res = json_decode($res_json); //id_token(JWT)を分解 $val = explode(".", $res->id_token); //2番目がデータ部分なのでbase64でデコード $data_json = base64_decode($val[1]); //bsae64でデコードしたjsonをオブジェクト化 $data = json_decode($data_json); //取得したデータを表示 print( "[sub]:[" . $data->sub . "][対象ユーザーの識別子]<br />\n" ); print( "[email]:[" . $data->email . "][email]<br />\n" ); print( "[email_verified]:[" . $data->email_verified . "][emailが認証済みかどうか]<br />\n" ); ?> |
この中でも「sub」というパラメータがユーザーを特定することのできる値なので以後の認証はこれを元に構築できるかと思います。
プログラム一式
google_openid_connect.zip
【参考にしたサイト】