チャネルアクセストークンv2.1を発行する
LINEプラットフォームでは、4種類のチャネルアクセストークンが利用可能です。このうち、チャネルアクセストークンv2.1とステートレスチャネルアクセストークンは、JSON Web Token(JWT)を用いて生成することができます。
このページでは、アサーション署名キーの仕様と、署名キーからJWTを生成する方法、また生成したJWTを用いてチャネルアクセストークンを発行する方法について、チャネルアクセストークンv2.1を対象に説明します。
チャネルアクセストークンv2.1の発行手順
チャネルアクセストークンv2.1の発行手順は下図のとおりです。この図は、次の3つの手順を表しています。
- アサーション署名キーを発行する (図の手順1)
- JWTを生成する (図の手順6)
- チャネルアクセストークンv2.1を発行する (図の手順7)
チャネルアクセストークンv2.1の発行における認証方式は「Using JWTs as Authorization Grants」(RFC 7523)に準拠しています。これはOAuth Assertion Framework(RFC 7521)のAssertion FrameworkにおいてJSON Web Token(RFC 7519)を利用したものです。
アサーション署名キーを発行する
アサーション署名キーの発行は、次の2つの手順で行います。
1. アサーション署名キーのキーペアを生成する
JWTを生成するには、アサーション署名キーのキーペア(秘密鍵・公開鍵)をあらかじめ生成する必要があります。
アサーション署名キーの仕様
以下の基準を満たすJSON Web Key(RFC7517)をJWTのアサーション署名キーとして利用できます。
- RSA公開鍵である(
ktyプロパティにRSAが設定されている)こと。 - RSA鍵長が2048bitであること。
- 署名アルゴリズムにRS256(RSASSA-PKCS1-v1_5 with SHA256)が使われている(
algプロパティにRS256が設定されている)こと。 - 公開鍵を署名に利用することが明示されている(
useやkey_opsが下表のように設定されている)こと。
したがって、アサーション署名キーの公開鍵には、以下のフィールドが含まれている必要があります。
| プロパティ | 説明 |
|---|---|
kty | 鍵で使用される暗号アルゴリズムファミリー。RSAを指定してください。 |
alg | 鍵で使用されるアルゴリズム。RS256を指定してください。 |
use*1 | 鍵の用途。sigを指定してください。 |
key_ops*1 | 鍵の利用が想定されているオペレーション。["verify"]のみを指定してください。 |
e | 公開鍵を復元するための絶対値 |
n | 公開鍵を復元するための暗号指数 |
*1 useかkey_opsのいずれかを指定してください。
登録する公開鍵にkidプロパティがないことを確認してください。アサーション署名キーの公開鍵にkidプロパティが含まれているとエラーになります。これはkidがLINE Developersコンソールで公開鍵を登録したときにのみ発行されるためです。
アサーション署名キーのキーペアは、公開仕様をもとに開発者が自らプログラムを作成して生成することもできますが、仕様を満たすライブラリ等を利用するとより簡単に生成できます。
以下、アサーション署名キーを生成する手順の例を紹介します。
jwx(Go言語のライブラリ)でキーペアを生成する
jwxコマンドラインツールでキーペアを生成できます。このコマンドラインツールは、オープンソースのGo言語ライブラリであるjwxの一部で、JWTの実装に使用されます。Go言語の開発環境が整っていない場合は、Go言語の公式サイトからGoをダウンロードしてください。
以下の手順でアサーション署名キーを発行してください。
1. jwxコマンドラインツールをインストールする
以下のコマンドを実行し、jwxコマンドラインツールをインストールします。
インストール完了後、jwxコマンドラインツールがインストールされたパスが表示されます。
以降の手順でコマンドが実行できるよう、パスの設定を行ってください。
2. 秘密鍵と公開鍵を生成する
以下のコマンドを実行し秘密鍵を生成します。
秘密鍵をもとに公開鍵を生成します。
成功すると以下のような秘密鍵と公開鍵が生成されます。
秘密鍵の例:
公開鍵の例:
JWCrypto(Pythonのライブラリ)でキーペアを生成する
JWTを実装するためのオープンソースのPythonライブラリであるJWCryptoでキーペアを生成できます。JWCryptoを使用するには、Python3とpipがインストールされている必要があります。Python3がインストールされていない場合は、Pythonの公式サイトからお使いのOSに対応したインストーラーをダウンロードし、インストールを進めてください。Python3がインストールされると、pipもインストールされます。Python3はインストールされているがpipがインストールされていない場合は、『pip documentation』を参照し、インストールしてください。
以下の手順でアサーション署名キーを発行してください。
1. JWCryptoをインストールする
以下のコマンドを実行しJWCryptoをインストールします。
2. 秘密鍵と公開鍵を生成するコードを書く
以下のように、ktyをRSA、algをRS256、useをsig、sizeを2048として引数に指定して、秘密鍵と公開鍵を生成するpythonファイルを作成します。
pythonファイルは任意のファイル名で保存してください。ここでは、app.pyとします。
保存したpythonファイルと同じディレクトリで、以下のコマンドを実行し、秘密鍵をもとに公開鍵を生成します。
成功すると以下のような秘密鍵と公開鍵が標準出力されます。
秘密鍵の例:
公開鍵の例:
ブラウザでキーペアを生成する
Web Crypto APIに対応しているウェブブラウザを使用している場合、SubtleCrypto.generateKey()メソッドを使って秘密鍵と公開鍵を生成できます。たとえば、Google Chromeを使用している場合は、Chromeのデベロッパーツールのコンソールから以下のコードを入力して実行します。
成功すると以下のような秘密鍵と公開鍵が生成されます。
秘密鍵の例:
公開鍵の例:
2. 公開鍵を登録し、kidを取得する
キーペアを生成したら、LINE Developersコンソールに公開鍵を登録し、kidを取得します。公開鍵を登録するには、コンソールにアクセスし、自分のチャネルのチャネル設定を開きます。[チャネル基本設定]タブをクリックし、次に、アサーション署名キーの横にある[公開鍵を登録する]ボタンをクリックします。公開鍵を入力し、[登録]ボタンで登録を確定します。
公開鍵の登録に成功すると、kidを取得できます。
JWTを生成する
JWTは、ヘッダー、ペイロード、署名からなる文字列です。すべての項目が必須フィールドです。JWTを生成するには、任意のJWTライブラリを使用することもできますし、アサーション署名キーを使って独自のコードをスクラッチで書くこともできます。
ヘッダー
ヘッダーには以下のプロパティを含める必要があります。
| プロパティ | 型 | 説明 |
|---|---|---|
alg | String | JWT生成のアルゴリズム。RS256を指定します。 |
typ | String | トークンのタイプ。JWTを指定します。 |
kid | String | キーID。「2. 公開鍵を登録し、kidを取得する」で取得したkidの値を指定します。 |
以下は、ヘッダーの値をデコードした例です。
ペイロード
ペイロードには以下のプロパティを含める必要があります。
| プロパティ | タイプ | 説明 |
|---|---|---|
iss | String | チャネルID。LINE Developersコンソールで取得できます。このプロパティの値はsubと同じにする必要があります。 |
sub | String | チャネルID。LINE Developersコンソールで取得できます。このプロパティの値はissと同じにする必要があります。 |
aud | String | https://api.line.me/を指定します。 |
exp | Number | JWTの有効期限をUNIX時間(秒)で指定します。JWTアサーションの最大有効期間は30分です。 |
token_exp | Number | チャネルアクセストークンの有効期間を秒単位で指定します。チャネルアクセストークンの最大有効期間は30日です。 |
以下は、デコードされたペイロードの例です。
署名
JWTを生成するには、ヘッダーとペイロードに署名する必要があります。node-jose(Node.jsのライブラリ)またはPyJWT(Pythonのライブラリ)を利用して、署名を作成し、それを使ってJWTを生成する方法を説明します。
node-jose(Node.jsのライブラリ)でJWTを生成する
Node.jsのライブラリであるnode-joseを使って署名を作成し、JWTを生成するには、Node.jsとnode-joseがインストールされていることを確認してください。
以下は、node-joseを使って秘密鍵で署名してJWTを生成するコードの例です。このコードを使って自分のJWTを生成する場合は、privateKeyを自分のアサーション署名キーの秘密鍵の値に変更し、headerとpayloadの値をそれぞれ変更してから実行します。内容が改ざんされていないことを証明するために、必ず秘密鍵で署名します。node-joseの使い方について詳しくは、node-joseを参照してください。
Base64形式でエンコードされたヘッダーとクレーム・セット、および秘密鍵(rsa_private.pemファイルなど)を、ヘッダーで定義したアルゴリズムを使用して署名します。署名後、Base64形式でエンコードされた結果がJWTです。以下はJWTの例です。
PyJWT(Pythonのライブラリ)でJWTを生成する
PyJWTを使って署名し、JWTを生成するには、PythonとPyJWTがインストールされている必要があります。
以下は、PyJWTを使って秘密鍵で署名してJWTを生成するコードの例です。このコードを使って自分のJWTを作成する場合は、privateKeyを自分のアサーション署名キーの秘密鍵の値に変更し、headersのkidとpayloadの値をそれぞれ変更してから実行します。コンテンツが改ざんされていないことを証明するために、必ず秘密鍵で署名します。PyJWTの使い方について詳しくは、PyJWTを参照してください。
Base64形式でエンコードされたヘッダーとクレーム・セット、および秘密鍵を、ヘッダーで定義したアルゴリズムを使用して署名します。署名後、Base64形式でエンコードされた結果がJWTです。以下はJWTの例です。
チャネルアクセストークンv2.1を発行する
生成したJWTアサーションを指定して、チャネルアクセストークンv2.1を発行できます。
- チャネルアクセストークンv2.1をリクエストすると、チャネルアクセストークンと一意のキーID(
key_id)のペアがレスポンスとして返されます。チャネルアクセストークンを適切に管理するため、チャネルアクセストークンとキーIDのペアを安全に保管するようにしてください。 - キーIDは、2020年6月22日にMessaging APIに追加された識別子です。キーIDを持たないチャネルアクセストークンv2.1を使用している場合は、チャネルアクセストークンv2.1を再発行し、トークンとキーIDのペアを保管することをお勧めします。チャネルアクセストークンを再発行した場合は、新しいトークンを使用するようにボットを更新してください。
チャネルアクセストークンv2.1を取得する手順は以下のとおりです。

- 生成したJWTを指定して、チャネルアクセストークンv2.1を発行するエンドポイントを実行し、チャネルアクセストークンを発行します。
- チャネルアクセストークンとキーIDがLINEプラットフォームから返ります。
- チャネルアクセストークンとキーIDをペアにしてデータベースなどに保管します。
チャネルアクセストークンv2.1を取り消す
チャネルアクセストークンv2.1を取り消すエンドポイントを実行することで、有効なチャネルアクセストークンを取り消すことができます。
無効なチャネルアクセストークンを指定して、チャネルアクセストークンv2.1を取り消すエンドポイントを実行した場合も、エラーレスポンスは発生しません。すべての有効なチャネルアクセストークンv2.1のキーIDを取得するエンドポイントを使って、現在有効なチャネルアクセストークンとペアになるキーIDを取得できます。取得したキーIDを、データベースなどに保管したチャネルアクセストークンとキーIDのペアと照合することで、有効なチャネルアクセストークンを識別できます。
チャネルアクセストークンv2.1を取り消す手順は以下のとおりです。

- 保存したアサーション署名キーからJWTを再生成します。
- JWTを使ってすべての有効なチャネルアクセストークンv2.1のキーIDを取得するエンドポイントを実行します。
- 有効なチャネルアクセストークンのキーIDがLINEプラットフォームから返ります。
- 取得したキーIDをデータベースと照合します。
- 取得したキーIDと一致する、チャネルアクセストークンとキーIDのペアがあるかどうかを確認します。
- 有効なチャネルアクセストークンを取得します。
- 有効なチャネルアクセストークンを指定して、チャネルアクセストークンv2.1を取り消すエンドポイントを実行します。
- LINEプラットフォームによってチャネルアクセストークンが取り消されます。