# ユーザーアカウントを連携する

アカウント連携機能を使うと、プロバイダー(企業や開発者)が提供するサービスの既存のユーザーアカウントを、LINE公式アカウントと友だちになっているLINEユーザーのアカウントとセキュアに連携できます。これにより、すでにプロバイダーが取得しているユーザー情報を活用し、LINE公式アカウントを使ってより良いサービスを提供できます。

たとえば、ショッピングサイトのユーザーアカウントとLINEのユーザーアカウントを連携すると、以下のようなサービスを提供できます。

  • ユーザーがショッピングサイトで商品を購入したときに、LINE公式アカウントからメッセージを送る。
  • ユーザーがLINE公式アカウントにメッセージを送信したら、受注処理を実行する。

LINEログインを使ってもアカウントを連携できますが、その場合はLINEログインのチャネルが必要です。アカウント連携機能は、Messaging APIのみを利用する場合にも実装できます。

アカウント連携のシーケンスは以下のとおりです。

アカウント連携のシーケンス

  1. ボットサーバーが、LINEのユーザーIDから連携トークンを発行するAPIを呼び出す。
  2. LINEプラットフォームがボットサーバーに、連携トークンを返す。
  3. ボットサーバーがユーザーに連携URLを送信するために、Messaging APIを呼び出す。
  4. LINEプラットフォームが、ユーザーに連携URLを送信する。
  5. ユーザーが連携URLにアクセスする。
  6. ウェブサーバーがログイン画面を表示する。
  7. ユーザーが認証情報を入力する。
  8. ウェブサーバーがプロバイダーのサービスのユーザーIDを取得し、それを使ってnonce(number used once)を生成する。
  9. ウェブサーバーが、ユーザーをアカウントを連携するエンドポイントにリダイレクトする。
  10. ユーザーが、アカウントを連携するエンドポイントにアクセスする。
  11. LINEプラットフォームがボットサーバーに、LINEのユーザーIDとnonceを含むイベントをWebhookで送信する。
  12. ボットサーバーが、nonceを使ってプロバイダーのサービスのユーザーIDを取得する。

このような機能は独自に実装することもできますが、セキュリティの問題が発生します。攻撃者が別のユーザーを連携URLに誘導することで、攻撃者のLINEアカウントを被害者の利用サービスのアカウントと連携することが可能となってしまいます。Messaging APIが提供するアカウント連携機能を使うと、連携URLを発行したユーザーと実際に連携したユーザーが同じかどうかをLINE側で検証するため、セキュアにアカウントを連携できます。

自社サービスのユーザーアカウントとLINEのユーザーアカウントを連携するには、以下の手順に従います。

HTTP POSTリクエストを/bot/user/{userId}/linkTokenエンドポイントに送信して、連携しようとしているユーザー用の連携トークンを発行します。

curl -X POST https://api.line.me/v2/bot/user/{userId}/linkToken \
-H 'Authorization: Bearer {channel access token}'

リクエストが成功すると、ステータスコード200と連携トークンが返されます。連携トークンの有効期間は10分で、1回のみ使用できます。

{
  "linkToken": "NMZTNuVrPTqlr2IF8Bnymkb7rXfYv5EY"
}

# 2. ユーザーを連携URLにリダイレクトする

ボットからユーザーに、連携URLを開くメッセージを送信します。たとえば、URIアクションを設定したテンプレートメッセージに連携URLを指定します。このとき、ステップ1で取得した連携トークンをURLのクエリパラメータとして指定します。

リクエストの例

curl -v -X POST https://api.line.me/v2/bot/message/push \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {channel access token}' \
-d '{
    "to": "{user id}",
    "messages": [{
        "type": "template",
        "altText": "Account Link",
        "template": {
            "type": "buttons",
            "text": "Account Link",
            "actions": [{
                "type": "uri",
                "label": "Account Link",
                "uri": "http://example.com/link?linkToken=xxx"
            }]
        }
    }]
}'

# 3. 自社サービスのユーザーIDを取得する

ユーザーが連携URLにアクセスしたら、自社サービスへのログイン画面を表示します。ユーザーがサービスにログインすると、自社サービスのユーザーIDを取得できます。

# 4. nonceを生成してユーザーをLINEプラットフォームにリダイレクトする

ステップ3で取得したユーザーIDからnonce(number used once)を生成します。nonceの要件は以下のとおりです。

  • 予測が難しく一度しか使用できない文字列であること。セキュリティ上問題があるため、自社サービスのユーザーIDなどの予測可能な値は使わないでください。
  • 長さは10文字以上255文字以下であること

nonceとしてランダムな値を生成する際の推奨事項は以下のとおりです。

  • 128ビット(16バイト)以上のデータで、セキュアなランダム生成関数を使う。
  • Base64エンコードする。

nonceは取得したユーザーIDと紐づけて保存します。

nonceとユーザーIDを保存したら、ユーザーを以下のエンドポイントにリダイレクトします。

https://access.line.me/dialog/bot/accountLink?linkToken={link token}&nonce={nonce}

ユーザーがこのエンドポイントにアクセスすると、LINEプラットフォームにより、ユーザーが連携トークンの対象ユーザーであるか確認されます。

  • アカウントを正常に連携できる場合:resultプロパティの値がokアカウント連携イベントがWebhookでボットサーバーに送信されます。
  • ユーザーのすり替えなどが原因で連携できない場合:resultプロパティの値がfailedアカウント連携イベントがWebhookでボットサーバーに送信されます。
  • 連携トークンの期限が切れている、または使用済みの場合:Webhookイベント自体が送信されず、ユーザーにエラーが表示されます。

# 5. アカウントを連携する

ボットサーバーでアカウント連携イベントを受信したら、連携処理を実行します。

Webhookイベントには、連携対象のLINEのユーザーIDとステップ4で生成したnonceが含まれています。このnonceを使って、nonceと紐づけて保存しておいた自社サービスのユーザーIDを特定します。このIDとLINEのユーザーIDを連携すれば、アカウントの連携が完了します。

# 連携解除について

アカウント連携機能を使う場合は、以下の2点を遵守してください。

  • ユーザーに連携解除機能を必ず提供すること
  • ユーザーがアカウントを連携するときに、連携解除機能があることを通知すること

たとえば、Messaging APIを使えば、表示するリッチメニューをユーザーごとに変更できます。アカウントを連携していないユーザーにはアカウントを連携するメニューを表示し、アカウントを連携済みのユーザーには連携を解除するメニューを表示すれば、ユーザーにとって使いやすい形でアカウント連携機能を提供できるでしょう。