前回はLINE Developersでチャネル登録までを行いました。
今回は実際にPHPでログインを実装していきます。
初期設定を定数にする
最初にdefineでチャネル登録した情報やAPIのURLを定義します。
1 2 3 4 5 6 7 |
<?php define("LINE_CLIENT_ID", "{LINE Developresに表示されているチャネルID}"); define("LINE_CLIENT_SECRET", "{LINE Developresに表示されているチャネルシークレット}"); define("LINE_REDIRECT_URI", "{LINEログイン設定に設定したコールバックURL}"); define("LINE_ACCESS_URI", "https://access.line.me/oauth2/v2.1"); define("LINE_API_URI", "https://api.line.me/oauth2/v2.1"); define("LINE_SCOPE", "profile openid"); |
メールアドレスを取得したい場合はLINE_SCOPEに「email」を追記してください。
LINE ログインのURLを作成する
LINEログインに利用するログインURLを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$base_url = LINE_ACCESS_URI."/authorize"; $client_id = LINE_CLIENT_ID; $redirect_uri = LINE_REDIRECT_URI; $_SESSION['_line_state'] = sha1(time()); $_SESSION['line_cmd'] = "sign up"; $query = ""; $query .= "response_type=" . urlencode("code") . "&"; $query .= "client_id=" . urlencode($client_id) . "&"; $query .= "redirect_uri=" . urlencode($redirect_uri) . "&"; $query .= "state=" . urlencode($_SESSION['_line_state']) . "&"; $query .= "scope=" . urlencode(LINE_SCOPE) . "&"; $url = $base_url . '?' . $query; |
これでURLができたのでこのURLに遷移するようにします。
$_SESSION[‘_line_state’]は符号のようなもので、実際にこのサイトから遷移したかどうか判断します。
コールバック時の処理
LINEログインに成功すると設定したコールバックURLにGETパラメータとともに遷移されるので、GETパラメータを解析します。
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 66 67 68 69 70 71 72 73 74 75 76 |
<?php $code = $_GET['code'] ?? ""; $state = $_GET['state'] ?? ""; // パラメータがあるかどうか if($code == "" || $state == ""){ header('Location: ./'); exit; } $session_state = $_SESSION['_line_state']; unset($_SESSION['_line_state']); // stateの確認 if ($session_state !== $state) { header('Location: ./'); exit; } // POSTパラメータの作成 $query = http_build_query([ "grant_type" => "authorization_code", "code" => $code, "redirect_uri" => $redirect_uri, "client_id" => $client_id, "client_secret" => $client_secret ]); // HTTPリクエストを初期化 $ch = curl_init(); // curlオプションを設定 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $query); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($query) ]); // HTTPリクエストを実行してレスポンスを取得 $res_json = curl_exec($ch); // エラーがあれば表示 if (curl_errno($ch)) { echo 'Curl error: ' . curl_error($ch); exit; } // 取得したjsonデータをオブジェクト化 $res = json_decode($res_json); $access_token = $res->access_token; $refresh_token = $res->refresh_token; $id_token = $res->id_token; // エラーを取得 if (isset($res->error)) { echo 'ログインエラーが発生しました。<br />'; echo "error: " . $res->error . '<br />'; echo $res->error_description; exit; } //id_token(JWT)を分解 $val = explode(".", $id_token); //2番目がデータ部分(PAYLOAD)なのでbase64でデコード $data_json = base64_decode($val[1]); //bsae64でデコードしたjsonをオブジェクト化 $data = json_decode($data_json); echo "userId:".$data->sub."<br />"; echo "name:".$data->name."<br />"; echo "picture:".$data->picture."<br />"; |
$data->sub が一意のIDになるので、これを取得して保存しましょう。
メールアドレスは「メールアドレス取得権限」の申請が通れば取得できます。