# ユーザーアカウントの連携

サービス提供者は、ユーザーのLINEアカウントと自社サービスのアカウントをセキュアに連携させることができます。アカウントを連携するには、ユーザーがLINE公式アカウントを友だち追加している必要があります。LINEアカウントと自社サービスのアカウントを連携させることで、自社サービスのユーザー情報をLINE上で活用できます。これにより、LINE公式アカウントでのユーザー体験を向上させることができます。

自社サービスのアカウントとLINEアカウントを連携させることで、ユーザーの利便性を高めることができます。たとえば、ショッピングサイトであれば、以下のようなことが可能です。

  • ユーザーがショッピングサイトで商品を購入したときに、LINE公式アカウントからメッセージを送る。
  • ユーザーがLINE公式アカウントとのトーク画面から注文する。

LINEログインを使ってもアカウントを連携できますが、その場合はLINEログインのチャネルが必要です。Messaging APIを使うと、LINEログインチャネルがなくてもアカウントを連携できます。

ユーザーのLINEアカウントと自社サービスのアカウントを連携するシーケンスは以下のとおりです。

  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を取得する。

Messaging APIを使わなくても、独自に実装してアカウントを連携させることもできます。ただし、アカウント連携では、ユーザーがセキュリティ上の問題にさらされる可能性があるため、独自で実装する場合には、より注意が必要です。たとえば、攻撃者がユーザーにURLを送り、攻撃者のLINEアカウントとユーザーの自社サービスのアカウントを連携させることが考えられます。Messaging APIを使うと、このような攻撃からユーザーを守ることができます。Messaging APIでは、連携URLを発行したユーザーが、連携しようとしているLINEアカウントの正当な所有者であるかどうかを検証します。

# アカウントを連携する

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

ユーザーのLINEアカウントと自社サービスのアカウントを連携するには、連携トークンが必要です。連携トークンを発行するには、/bot/user/{userId}/linkTokenエンドポイントにHTTP POSTリクエストを送信します。

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を指定します。このとき、連携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を生成したら、そのnonceとサービスのユーザーIDを紐づけて保存します。次に、ユーザーを以下のエンドポイントにリダイレクトします。

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

ユーザーがこのエンドポイントにアクセスすると、LINEプラットフォームにより、ユーザーが連携トークンを発行したユーザーかどうかを確認します。その確認結果に応じて、LINEプラットフォームは以下のような処理を行います。

  • ユーザーの確認ができた場合:LINEプラットフォームからボットサーバーにresultプロパティの値がokアカウント連携イベントが送信されます。
  • ユーザーの確認ができなかった場合:LINEプラットフォームからボットサーバーにresultプロパティの値がfailedアカウント連携イベントが送信されます。
  • 連携トークンが無効の場合:連携トークンが有効期限切れや、使用済みの場合、LINEプラットフォームはWebhookイベントを送信せず、ユーザーにエラーを表示します。

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

ステップ4で、連携トークンを発行したユーザーであることが確認できた場合、ユーザーのアカウントを連携します。アカウント連携イベントには、LINEのユーザーIDとnonceが含まれています。このnonceを使って、nonceと紐づけて保存しておいた自社サービスのユーザーIDを取得します。LINEのユーザーIDと自社サービスのユーザーIDを連携すれば、アカウントの連携が完了します。

# アカウントの連携を解除する

ユーザーがLINEアカウントと自社サービスのアカウントを連携している場合、連携を解除できるようにする必要があります。

  • ユーザーがいつでもアカウントの連携を解除できるようにしておくこと。
  • ユーザーがアカウントを連携するときに、連携を解除できることを通知すること。

たとえば、Messaging APIを使えば、ユーザーごとにリッチメニューをカスタマイズできます。アカウントを連携していないユーザーにはアカウントを連携するメニューを表示したり、アカウントを連携済みのユーザーには連携を解除するメニューを表示したりできます。