【php】Lineアカウントでのログインを実装する

はじめに

FacebookとかTwitterアカウントでのログインは何回かやったことあったけどLineは初めてだった気がしたのでメモしておく。
といっても、ちょっとしたアカウント情報取得するのはやり方どれも同じような感じですけど。

http://milk0824.hatenadiary.jp/entry/2016/04/08/021052
手順はここにわかりやすくまとまっていた。↑にあるように管理画面からLineアプリ作って、クライアントIDとシークレットキーを取得しておく。

実装

define.php

define("LINE_CLIENT_ID", "クライアントID");
define("LINE_CLIENT_SECRET", "シークレットキー");

line_login.php

$callback_url = "https://".$_SERVER["SERVER_NAME"]."/line_callback.php";

$url = sprintf(
    "https://access.line.me/dialog/oauth/weblogin"
    ."?response_type=code"
    ."&client_id=%s"
    ."&redirect_uri=%s"
    ,LINE_CLIENT_ID
    ,$callback_url
);

header("Location: {$url}");
exit;

これでLine側のページが表示されて、IDとパスワードを入力する。

line_callback.php

if (!$_GET["code"]) {
    // エラー                                                                                                                                                                                                      
}

// アクセストークン取得
$url = "https://api.line.me/v1/oauth/accessToken";

$data = array(
    "grant_type" => "authorization_code",
    "client_id" => LINE_CLIENT_ID,
    "client_secret" => LINE_CLIENT_SECRET,
    "code" => $_GET["code"],
    "redirect_uri" => "",
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch);
curl_close($ch);
$result = (array)json_decode($response, true);

if (empty($result) || isset($result["error"])) {
    // エラー
}

print_r($result);
/*
Array
(
    [mid] => xxxxxxxxxxxxxxxxxxxxxxxxx
    [access_token] => xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    [token_type] => Bearer
    [expires_in] => 2568710
    [refresh_token] => xxxxxxxxxxxxxxxxxxxx
    [scope] =>
)
 */

// プロフィール情報を取得                                                                                                                                                                                          
$url = "https://api.line.me/v2/profile";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.line.me/v2/profile");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $result["access_token"]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);

$result = (array)json_decode($response, true);
if (empty($result) || empty($result["userId"])) {
    // エラー
}

print_r($result);
/*
Array
(
    [userId] => xxxxxxxxxxxxxxxx
    [displayName] => ユーザー名
    [pictureUrl] => ユーザー画像のURL
)
 */

あとは、取得した情報からシステム側でログインの制御とかすれば良さそう。以上です。