PHP | LINEログインのサンプル(LINEログイン v2.1)

PHPアプリでLINEログインを利用したかったのでサンプルを作りました。以下の6つのファイルに分けています。

index.phpLINEログインのボタン設置と取得した結果の表示ページに使用
err.php特別機能させていないため不要ですが、エラー表示ページに使用
config.phpチャンネルID、チャンネルシークレットなどを定数で設定
init.php共通処理を記述(※サンプルはセッション開始のみ)
login.phpLINE側へリクエストするURL生成とリダイレクト
callback.phpLINE Developers のLINEログイン設定のコールバックURLに設定する

LINE Developers でLINEログイン用のチャンネル登録し、チャンネルID・チャンネルシークレットを取得する必要があります。

チャンネルID・チャンネルシークレット等を定数で定義

“config.php” に予め取得したチャンネルID・チャンネルシークレット等の情報を定数で定義します。

<?php
/**
 * サイト情報
 */
// サイトのベースURL
define('SITE_URL_BASE', 'https://example.com/');
// LINEログインボタン設置場所などサイトホーム
define('SITE_URL_HOME', SITE_URL_BASE.'index.php');
// コールバックURL
define('SITE_URL_CALLBACK', SITE_URL_BASE.'callback.php');
// ログインURL生成とリダイレクト
define('SITE_URL_LOGIN', SITE_URL_BASE.'login.php');
// エラーページ
define('SITE_URL_ERR', SITE_URL_BASE.'err.php');


/**
 * LINEチャンネル設定情報
 */
// チャネルID
define('CLIENT_ID', '1234567890');
// チャネルシークレット
define('CLIENT_SECRET', '1122***************');


/**
 * LINEログイン API エンドポイント
 */
// ユーザーに認証と認可を要求する
define('LINE_EP_AUTHORIZE', 'https://access.line.me/oauth2/v2.1/authorize');
// アクセストークンを発行する
define('LINE_EP_TOKEN', 'https://api.line.me/oauth2/v2.1/token');
// IDトークンを検証する
define('LINE_EP_VERIFY', 'https://api.line.me/oauth2/v2.1/verify');
// ユーザー情報を取得する
define('LINE_EP_USERINFO', 'https://api.line.me/v2/userinfo');
// ユーザープロフィールを取得する
define('LINE_EP_PROFILE', 'https://api.line.me/v2/profile');

共通処理の設定

“init.php” にLINE側から取得した情報をセッションに保存するためセッション開始のコードを追加します。

<?php
// セッション開始
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

コールバックURLで受ける処理の設定

“callback.php” にアクセストークンの取得、IDトークンからプロフィール情報の取得、ユーザープロフィールの取得処理を

<?php
// 
require_once 'config.php'; // 設定ファイル
require_once 'init.php';   // 共通処理

// state チェック
if( !isset($_SESSION['state']) || (int)$_SESSION['state'] !== (int)$_GET['state'] ) {
    header("Location: ".SITE_URL_ERR);
    exit;
}


/**
 * アクセストークンを取得する
 */

// POSTするデータ
$postData = [
    "grant_type"    => "authorization_code",
    "code"          => $_GET["code"],
    "redirect_uri"  => SITE_URL_CALLBACK,
    "client_id"     => CLIENT_ID,
    "client_secret" => CLIENT_SECRET
];

// 
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
curl_setopt($ch, CURLOPT_URL, LINE_EP_TOKEN);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

// 
$json                       = json_decode($response); // JSONオブジェクトをデコード
$access_token               = $json->access_token;    // アクセストークンを取得
$id_token                   = $json->id_token;        // IDトークンを取得
$_SESSION['line_res_token'] = $json;                  // レスポンスをセッションに保存

// ## レスポンス ##
// access_token  // アクセストークン。有効期間は30日です
// expires_in    // アクセストークンの有効期限が切れるまでの秒数
// id_token      // ユーザー情報を含むJSONウェブトークン(JWT)
// refresh_token // 新しいアクセストークンを取得するためのトークン
// scope         // ユーザーが付与する権限
// token_type    // Bearer

// {
//     "access_token":"eyJhb*****.YUTdG**********.AMgJc*****",
//     "token_type":"Bearer",
//     "refresh_token":"emwROatU6mHtZjH6a7Ek",
//     "expires_in":2592000,
//     "scope":"profile openid",
//     "id_token":"eyJ0eXAiOi**********"
// }



/**
 * IDトークンからプロフィール情報を取得する
 */

// POSTするデータ
$postData = [
    'id_token'  => $id_token,
    'client_id' => CLIENT_ID
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
curl_setopt($ch, CURLOPT_URL, LINE_EP_VERIFY);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

// 
$json                        = json_decode($response); // 
$email                       = $json->email;           // emailを取得
$_SESSION['line_res_verify'] = $json;                  // レスポンスをセッションに保存

// ## レスポンス ##
// iss      // IDトークンの生成URL
// sub      // IDトークンの対象ユーザーID
// aud      // チャネルID
// exp      // IDトークンの有効期限(UNIXタイム)
// iat      // IDトークンの生成時間(UNIXタイム)
// amr      // ユーザーが使用した認証方法のリスト
// name     // ユーザーの表示名(※認可リクエストにprofileスコープの指定が必要)
// picture  // ユーザープロフィールの画像URL(※認可リクエストにprofileスコープの指定が必要)
// email    // ユーザーのメールアドレス(※認可リクエストにemailスコープの指定が必要)

// {
//     "iss":"https://access.line.me",
//     "sub":"Uefaa.....",
//     "aud":"1234567890",
//     "exp":1655443107,
//     "iat":1655439507,
//     "amr":["linesso"],
//     "name":"深尾 拓生",
//     "picture":"https://profile.line-scdn.net/0hdEi.....",
//     "email":"user@example.com"
// }



/**
 * ユーザープロフィールを取得する
 */

$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $access_token));
curl_setopt($ch, CURLOPT_URL, LINE_EP_PROFILE);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

// 
$json                         = json_decode($response); // 
$_SESSION['line_res_profile'] = $json;                  // 

// ## レスポンス ##
// userId         // ユーザーID
// displayName    // ユーザーの表示名
// statusMessage  // ユーザーのステータスメッセージ
// pictureUrl     // プロフィール画像のURL

// {
//     "userId":"Uefaa**********",
//     "displayName":"深尾 拓生",
//     "statusMessage":"\uDBC0\uDC01",
//     "pictureUrl":"https://profile.line-scdn.net/0hdEi....."
// }


// セッションデータを書き込みセッションを終了する
session_write_close();

// 
header("Location: ".SITE_URL_HOME);
exit;

LINE側へリクエストするURL生成処理の設定

“login.php” にLINEログインを行う際、LINE側へリクエストするURLの生成とリダイレクト処理を設置します。

<?php
// 
require_once 'config.php'; // 設定ファイル
require_once 'init.php';   // 共通処理

//
$state             = rand();
$_SESSION['state'] = $state;


// 
$url = LINE_EP_AUTHORIZE.'?' . http_build_query([
    'response_type' => 'code',
    'client_id'     => CLIENT_ID,
    'redirect_uri'  => SITE_URL_CALLBACK,
    'state'         => $state,
    'scope'         => 'profile openid email',
]);

// 
header("Location: ".$url);
exit;

LINEログインのボタン設置と結果の表示

“index.php” にLINEログインのボタンの設置とLINEログイン処理で、”callback.php” で受け取った情報を表示します。

<?php
// 
require_once 'config.php'; // 設定ファイル
require_once 'init.php';   // 共通処理

// セッションから情報取得
$line_res_token   = $_SESSION['line_res_token'] ? $_SESSION['line_res_token'] : '';
$line_res_verify  = $_SESSION['line_res_verify'] ? $_SESSION['line_res_verify'] : '';
$line_res_profile = $_SESSION['line_res_profile'] ? $_SESSION['line_res_profile'] : '';

?><!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>LINEログイン</title>
</head>
<body>

    <h1>LINEログイン</h1>

    <div>
        <p>
            <a href="<?php echo SITE_URL_LOGIN; ?>">LINEでログインする</a>
        </p>
    </div>

    <?php if ( $line_res_token ): ?>
    <div>
        <h2>アクセストークンを取得する</h2>
        <table>
            <tr>
                <th>access_token</th>
                <td><?php echo $line_res_token->access_token;?></td>
            </tr>
            <tr>
                <th>expires_in</th>
                <td><?php echo $line_res_token->expires_in;?></td>
            </tr>
            <tr>
                <th>id_token</th>
                <td><?php echo $line_res_token->id_token;?></td>
            </tr>
            <tr>
                <th>refresh_token</th>
                <td><?php echo $line_res_token->refresh_token;?></td>
            </tr>
            <tr>
                <th>scope</th>
                <td><?php echo $line_res_token->scope;?></td>
            </tr>
            <tr>
                <th>token_type</th>
                <td><?php echo $line_res_token->token_type;?></td>
            </tr>
        </table>
    </div>
    <?php endif; ?>

    <?php if ( $line_res_verify ): ?>
    <div>
        <h2>IDトークンからプロフィール情報を取得する</h2>
        <table>
            <tr>
                <th>iss</th>
                <td><?php echo $line_res_verify->iss;?></td>
            </tr>
            <tr>
                <th>sub</th>
                <td><?php echo $line_res_verify->sub;?></td>
            </tr>
            <tr>
                <th>aud</th>
                <td><?php echo $line_res_verify->aud;?></td>
            </tr>
            <tr>
                <th>exp</th>
                <td><?php echo $line_res_verify->exp;?></td>
            </tr>
            <tr>
                <th>iat</th>
                <td><?php echo $line_res_verify->iat;?></td>
            </tr>
            <tr>
                <th>amr</th>
                <td><?php echo implode(' / ', $line_res_verify->amr);?></td>
            </tr>
            <tr>
                <th>name</th>
                <td><?php echo $line_res_verify->name;?></td>
            </tr>
            <tr>
                <th>picture</th>
                <td><?php echo $line_res_verify->picture;?></td>
            </tr>
            <tr>
                <th>email</th>
                <td><?php echo $line_res_verify->email;?></td>
            </tr>
        </table>
    </div>
    <?php endif; ?>

    <?php if ( $line_res_profile ): ?>
    <div>
        <h2>ユーザープロフィールを取得する</h2>
        <table>
            <tr>
                <th>userId</th>
                <td><?php echo $line_res_profile->userId;?></td>
            </tr>
            <tr>
                <th>displayName</th>
                <td><?php echo $line_res_profile->displayName;?></td>
            </tr>
            <tr>
                <th>statusMessage</th>
                <td><?php echo $line_res_profile->statusMessage;?></td>
            </tr>
            <tr>
                <th>pictureUrl</th>
                <td><?php echo $line_res_profile->pictureUrl;?></td>
            </tr>
        </table>
    </div>
    <?php endif; ?>

</body>
</html>

動作環境情報

"エックスサーバー" スタンダード(旧X10)
"PHP" 7.4.28
"MariaDB" 10.5
"LINEログイン" v2.1

LINE公式ドキュメント

LINEログイン | LINE Developers

LINE Developers
LINE Developersサイトは開発者向けのポータルサイトです。LINEプラットフォームのさまざまな開発者向けプロダクトを利用するための、管理ツールやドキュメントを利用できます。LINEログインやMessaging APIを活用して、...

LINEログイン v2.1 APIリファレンス

LINEログイン v2.1 APIリファレンス
LINE Developersサイトは開発者向けのポータルサイトです。LINEプラットフォームのさまざまな開発者向けプロダクトを利用するための、管理ツールやドキュメントを利用できます。LINEログインやMessaging APIを活用して、...

ソーシャルログイン関連記事

コメント

タイトルとURLをコピーしました