PHPでLINEログインを作ってみた

はじめに

自身のWebアプリケーションにLINEログインを使ってログインできるようにしてみました。
LINEログインを使うことでユーザはLINEアカウントをWebアプリのユーザとして使用したり、
ログイン認証にLINEを使ってログインすることが可能になります。

公式サイトはこちらです。

https://developers.line.biz/ja/services/line-login/

環境

# 項目 バージョン
1 CentOS 7.8
2 PHP 7.2.29
3 Apache 2.4.6

Messaging API とは異なり、サーバを外部公開せずとも動かすことができます。
今回は、ローカル環境に立てたCentOSのサーバを使って試していきます。

LINE Developers の設定

1. LINE Developers にログインする

https://developers.line.biz/ja/

LINEアカウントでログインできるので、自身のLINEアカウントでログインします。
LINEアカウントをもってない場合は、LINEアカウントを作りましょう。

2. LINEログイン の設定をする

プロバイダーを作って、チャネルを作成します。
チャネル作成をするときに、LINEログインを選択します。
お好きなチャネル名にし、その他必須事項を入力し、作成をクリックします。

3. コールバックURL の設定をする

LINEログイン設定タブにあるコールバックURLに、LINEでログイン処理を行った後に遷移したいURLを指定します。

プログラム を書く

1.アクセストークンを取得する

下記のコードでアクセストークンを取得します。

$postData = array(
    'grant_type'    => 'authorization_code',
    'code'          => $_GET['code'],
    'redirect_uri'  => 'コールバックURLに設定したURLを記載',
    'client_id'     => 'チャネルID(LINEログインチャネルの管理画面から確認)',
    'client_secret' => 'チャネルシークレット(LINEログインチャネルの管理画面から確認)',
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
curl_setopt($ch, CURLOPT_URL, 'https://api.line.me/oauth2/v2.1/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);
$accessToken = $json->access_token; //アクセストークンを取得

2.アクセストークンを基にユーザ情報を取得する

先ほど取得したアクセストークンを使って、アクセスしてきたユーザのLINEIDを取得します。

$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $accessToken));
curl_setopt($ch, CURLOPT_URL, 'https://api.line.me/v2/profile');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

$json = json_decode($response);
$userInfo= json_decode(json_encode($json), true); //ログインユーザ情報を取得する

取得したユーザ情報userInfoの中身は下記のように配列定義されています。

Array ( 
    [userId] => XXXXXXXXXXXXXXXXXXX, ← ログインに使用したアカウントのID
    [displayName] => ○○○○, ← ログインに使用したアカウントの名前
)

userIdはシステム内で付与されているユニークなIDです。
ログイン処理に使用する場合は、こちらのIDを使用しましょう。
LINEメッセージを送る際も、このIDを使用するので、userIdを取得しておいた方がよいです。

3.ログインURLの設置

あとは、ログインURLを設置するだけです。
下記のURLをログイン処理をさせたいページに配置するだけで完了です。
乱数には、md5(uniqid())を使用しました。

https://access.line.me/oauth2/v2.1/authorize?response_type=code&client_id=[チャネルID]&redirect_uri=[コールバックURLに設定したURLを記載]&state=乱数&scope=profile

補足

1.Botと連携したい場合

ログインと同時に、MessagingAPIで作ったBotにお友だち登録をさせたい場合、
LINEログインのチャネル基本設定リンクされたボットから連携させたいボットのチャネルを選択します。

そして、ログインURLにbot_promptを追加します。

https://access.line.me/oauth2/v2.1/authorize?response_type=code&client_id=[チャネルID]&redirect_uri=[コールバックURLに設定したURLを記載]&state=乱数&bot_prompt=aggressive&scope=profile

この処理を実装すると、ユーザがLINEログインした後、チャットボットのチャネルをお友だち追加するかどうかを確認されます。
ユーザがお友だち追加を許可すると、ユーザへボットのチャネルを通してメッセージを送ることができるようになります。

bot_promptには、aggressive以外にも、normalがあります。
詳細は下記をご確認ください。

https://developers.line.biz/ja/docs/line-login/link-a-bot/#displaying-the-option-to-add-your-line-official-account-as-a-friend

2.GETパラメータを追加したい場合

リダイレクトURLに対して、GETパラメータを渡したい場合があるかと思います。
https://hoge.comというURLにGETパラメータを付けたい場合を例に説明します。

  • LINE Developers の設定
    リダイレクトURLはそのままhttps://hoge.comを設定します。

  • ログインURLのリダイレクトURLにGETパラメータを追加
    リダイレクトURLにGETパラメータ?data=testを追記します。

    https://access.line.me/oauth2/v2.1/authorize?response_type=code&client_id=[チャネルID]&redirect_uri=https://hoge.com?data=test&state=乱数&bot_prompt=aggressive&scope=profile
  • アクセストークンを取得する
    リダイレクトURLにGETパラメータを追記します。

    $postData = array(
    'grant_type'    => 'authorization_code',
    'code'          => $_GET['code'],
    'redirect_uri'  => 'https://hoge.com?data='.$_GET['data'],
    'client_id'     => 'チャネルID(LINEログインチャネルの管理画面から確認)',
    'client_secret' => 'チャネルシークレット(LINEログインチャネルの管理画面から確認)',
    );

そうすると、GETパラメータのtestという値が取得でき、かつLINEログインもできます。

さいごに

このように、LINEログインを使用することで、LINEのIDが取得できます。
DB上のLINEIDと比較し、一致していればログインを許可するとすればLINEログインの実装の完了です。
LINEIDを取得してDBに登録する処理やそのIDと一致するかの判定処理はご自身で実装してください。
今回、記載したように簡単にログイン実装することができるので、一度、試してみてください。