【flask】liffでユーザーのline idやユーザー名を取得する方法

この記事について

環境LIFF + Flask
目的LIFFアプリでユーザーのLINE IDと表示名を取得する
結果liff.getProfile()と、IDトークンをサーバーで検証する方法の2通りを整理

つまずきポイント要約

  • getProfile()で取った値をそのまま自前サーバーに送るのはセキュリティ上非推奨
  • サーバーに送るならIDトークンをLINEのverifyエンドポイントで検証して取得する
  • メールアドレスも取得したい場合はOpenID Connectの申請が必要

lineのliffでユーザーのline idやユーザー名を取得する方法

方法1

liff.getProfile()を利用

jsファイル

$(function () {
    //LIFFアプリの初期化。このメソッドのあとLIFF SDKの他のメソッドを実行できるようになる
    liff.init({
        liffId: 'xxxxxxxxxxxxxxxxx',
        //初期化が終わったら
    }).then(() => {
        liff.getProfile().then(function (profile) {
            // 非同期処理が成功した場合
            const line_userid = profile.userId;
            const line_displayname = profile.displayName;
            //alert("line_userid: " + line_userid + "\nline_displayname: " + line_displayname);
        }).catch(function (error) {
            // 非同期処理が失敗した場合
            // handle error
        });

ただしこの方法で取得したユーザーidやユーザー名を自前サーバーに送ることはセキュリティ上推奨されていない。そこで以下の方法で取得する必要がある。

方法2

IDトークンを利用

LIFFアプリおよびサーバーでユーザー情報を使用する
ユーザーが、LIFFブラウザでLIFFアプリを起動したり、外部ブラウザでLIFFアプリを起動してメソッドでログイン処理を行ったりすると、LIFFアプリはユーザーのプロフィール(ユーザーID、表示名、プロフィール画像、メールアドレス)を取得できます。LIFFアプリで、これらのユーザー情報を正しく処理しないと、なりすましや...

jsファイル

    liff.init({
        liffId: '/ajax',
        //初期化が終わったら
    }).then(() => {
        const accessToken = liff.getAccessToken();
        const idToken = liff.getIDToken();

        // ajax通信
        $.ajax({
            url: 'xxxxxxxxxxx', //アクセスするURL
            type: 'POST',   //デフォルトはGET
            cache: false,   //cacheを使うか使わないかを設定
            data: {
                "accessToken": accessToken,
                "idToken": idToken
            }          //アクセスするときに必要なデータを記載      
        })

views.py

@liff.route("/ajax", methods=["POST"])
def ajax():
    if request.method == "POST":
        accessToken = request.form["accessToken"]
        idToken = request.form["idToken"]
        data = {"id_token": idToken, "client_id": "1661541967"}
        # LINE APIにリクエストを送信する
        response = requests.post(
            "https://api.line.me/oauth2/v2.1/verify",
            data=data,
        )

        if response.status_code == 200:
            print("投稿成功")
            # LINE APIから、ユーザーのプロフィール情報を取得する
            user_profile = response.json()
        else:
            print("投稿失敗")

詳細

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

また、この方法でユーザーのメールアドレスを取得したい場合は、OpenID Connectの申請が必要になる。

OpenID Connectの申請方法 | リタッチ
お客様の公式LINEアカウントでキャンペーンを開催する方法です。LINEアプリ上で、参加者のアカウントと自動連携され応募が可能になります。
タイトルとURLをコピーしました