LINEミニアプリのユーザー認証:IDトークンをサーバーで検証する
会員証やモバイルオーダーをつくるとき、最初に決めるのが「このユーザーは誰か」をサーバーがどう知るかです。ここを間違えると、他人になりすまして会員情報や注文を操作されるおそれがあります。この記事では、LINEミニアプリ(LIFF)でユーザーを安全に識別する方法を整理します。内容は2026年11月時点のLINE公式ドキュメントにもとづいています。
原則:プロフィールではなく、トークンをサーバーに送る
LIFFには、ユーザーのプロフィールを取得する liff.getProfile() や、IDトークンの中身を読む liff.getDecodedIDToken() があります。しかし、これらで得た値をそのままサーバーに送って信用してはいけません。ブラウザから送られる値は、利用者が書き換えられるからです。LINEのドキュメントも、これらの値をサーバーに送らないよう注意しています。
サーバーに送るのはトークンです。サーバーがLINEに問い合わせてトークンを検証し、その結果からユーザーを特定します。
方法1:IDトークンを検証する(おすすめ)
- クライアントで
liff.getIDToken()を呼び、IDトークン(JWT)を取得する - IDトークンをサーバーに送る
- サーバーから、LINEの検証エンドポイント(
POST https://api.line.me/oauth2/v2.1/verify)にIDトークンとチャネルIDを送る - 検証が成功すると、ユーザーID(
sub)などが返る。これを会員データのキーにする
IDトークンには openid スコープが必要です。検証では、チャネルIDが自分のものと一致すること、有効期限が切れていないことも確認されます。
方法2:アクセストークンを使う
- クライアントで
liff.getAccessToken()を呼ぶ - サーバーで
GET https://api.line.me/oauth2/v2.1/verifyを呼び、チャネルIDと有効期限を確認する - 確認できたら
GET https://api.line.me/v2/profileでプロフィールを取得する
アクセストークンは、ユーザーがミニアプリを閉じると無効になります。サーバー側で長く保持する前提の設計にはしないでください。
スコープは必要最小限に
| スコープ | できること |
|---|---|
openid | IDトークンの取得(getIDToken) |
profile | 表示名やアイコンの取得(getProfile)、友だち状態の確認 |
email | メールアドレスの取得(チャネルで別途申請が必要) |
chat_message.write | トークへのメッセージ送信(liff.sendMessages) |
電話番号などの情報は、承認を受けた法人向けの「LINE Profile+」が必要です。
チャネル同意の簡略化を使うとき
認証済ミニアプリでは、初回の同意画面を省略できる「チャネル同意の簡略化」が使えます。2026年1月以降に作成した日本向けのチャネルでは、常に有効です。
このとき最初に許可されるのは openid だけです。profile などのスコープは、必要になった時点で許可を求める画面が表示されます(liff.permission.requestAll() で先に表示することもできます)。そのため、IDトークンにプロフィール情報が入っていないことがあります。ユーザーの識別は sub(ユーザーID)で行い、名前やアイコンはあとから取得する設計にしておくと安全です。
見落としやすい点
- ユーザーIDはプロバイダーごとに違う:同じ人でも、プロバイダーが違えばユーザーIDは別になります。チャネルを別のプロバイダーに移すこともできないので、最初にどのプロバイダーで作るかを決めておきます。
- 退会時の連携解除:ユーザーが退会したときは、LINEログインの連携解除のエンドポイントで、アプリへの許可を取り消す必要があります。
- チャネルアクセストークン:LINEミニアプリチャネルで使えるのは、ステートレスチャネルアクセストークンのみです。