はじめに
アクセストークンを含む API リクエストを受け取ったリソースサーバーは、そのトークンに付随する情報をもとに、API アクセスの可否や、レスポンスの内容を決定します。基本的な付随情報としてはたとえば、トークンの状態(有効・無効)や、誰(リソースオーナー)が何(クライアント)にどのようなアクセス権(スコープ)を移譲したかなどですが、場合によっては、認可サーバーからさらに他の関連情報を得る必要があります。 Authlete では、アクセストークンまたは認可コードに任意のプロパティ群 (properties) をひもづける機能を持っています。この機能により、認可サーバーはリソースサーバーに対し、API リクエストの可否判定やリクエストの処理内容に必要な情報を提供しやすくなります。また、プロパティの受け渡しはクライアントを介さずに行うことが可能であり、不必要な情報露見を防止できます。ユースケース
例 1: 送金 API の制御
送金機能をもつ銀行 API において「ABC商店へ5,000円を送金する」といった機能を実現するとします。 これを「ABC商店へ5,000円を送金する」というスコープを作って実現しようとすると、送金先および送金額を組み合わせた数のスコープが必要になってしまいます。これは現実的ではありません。 Authlete のプロパティを用いると、認可サーバーがクライアントに対して発行するアクセストークンに、上記の情報をプロパティとして直接埋め込む、ないしは、上記情報を管理する DB のレコードにひもづけておくことができます。クライアントからアクセストークンを受け取った銀行 API は、そのトークンにひもづいているプロパティから上記の情報を取得し、送金可否の判断が可能となります。
例 2: ロールベースのアクセス管理
リソースサーバーが、クライアントから提示されたアクセストークンから、そのトークンにひもづくユーザーの識別子だけではなく、ユーザーの属するグループやロールを知りたいとします。 単純な実現方法としては、リソースサーバーは受け取ったアクセストークンのイントロスペクションを行ってユーザー識別子を取得した上で、そのユーザーのグループやロールを得るために、別のデータベースに問い合わせを行うことになります。 これもまた、Authlete のプロパティを用いると、認可サーバーがユーザーのグループやロールをトークンにひもづけ、その値をリソースサーバーが Authlete から取得する、という連携が可能となり、前述したような、リソースサーバーからデータベースへの問い合わせが不要となります。
利用方法
本セクションではプロパティの設定・取得の利用方法を紹介します。
Property データタイプ
Authlete では、アクセストークンないしは認可コードにひもづけるプロパティ(任意のパラメーター群)を、Property データタイプとして定義しています。Property データタイプは次のようなエントリーを持つ JSON オブジェクトです。
たとえば、キーが example_key、値が example_value であり、クライアントから秘匿しない(クライアントへの露見を許容する)プロパティは、以下のような JSON オブジェクトになります。
プロパティのひもづけ
アクセストークンへのプロパティのひもづけは、下記のタイミングで行います。認可サーバーが「認可エンドポイント」から認可コードもしくはアクセストークンを返却する直前
認可サーバーが /auth/authorization/issue API を呼び出す際にプロパティをセットします。 以下は curl コマンドによる実行例です。(見やすさのため折り返しています)- リクエスト
- レスポンス
authlete-java-jaxrs ライブラリを用いる場合 、AuthorizationDecisionHandlerSpiAdapter クラスの getProperties メソッド を変更することで、任意のプロパティーをひもづけすることができます(デフォルトでは、 null が返されます)。
認可サーバーが「トークンエンドポイント」からアクセストークンを返却する直前
認可サーバーが /auth/token API を呼び出す際にプロパティをセットします。以下は curl コマンドによる実行例です。(見やすさのため折り返しています)- リクエスト
- レスポンス
ここでは “hidden”:false としているため、トークンレスポンスの一部として、あるいは JWT 形式のアクセストークン を用いた場合にはそのペイロードとして、プロパティがクライアントに開示されます。プロパティをリソースサーバーだけに開示し、クライアントから秘匿する場合には、この値を false ではなく true とします。
プロパティの取得
リソースサーバーが /auth/introspection API を呼び出すと、そのレスポンスにプロパティが含まれます。以下は curl コマンドによる実行例です。(見やすさのため折り返しています)- リクエスト
- レスポンス
フローごとの例
プロパティを渡す API は、フローによって異なります。アクセストークンを発行する API がフローごとに違うためです。ここでは、フローごとにproperties パラメーターを受け取る API 呼び出しと、その結果としてクライアントおよびリソースサーバーが受け取る内容を示します。
以下の例では、プロパティとして example_parameter=example_value を使用します。${SERVICE_API_KEY} はサービス ID、Bearer トークンはサービスアクセストークンです。
認可コードフロー
-
クライアントからの認可リクエストを /auth/authorization API に渡します。レスポンスには
action: INTERACTIONとticketが含まれ、ticketは次の呼び出しで使用します。 -
/auth/authorization/issue API で認可コードを発行します。ここで渡したプロパティは認可コードにひもづき、その認可コードと引き換えに発行されるアクセストークンへ引き継がれます。
action: LOCATIONは、認可サーバーがクライアントへ302 Foundを返し、responseContentの値をLocationヘッダーに使用することを表します。 -
認可コードを /auth/token API で交換します。この呼び出しでもプロパティを追加でき、手順 2 で渡したものとマージされます。同じキーが両方にある場合は、
/auth/tokenに渡した値が優先されます。action: OKは、認可サーバーがクライアントへ200 OKを返し、responseContentの値をレスポンスボディに使用することを表します。どちらのプロパティもhiddenを指定していないため、クライアントに開示されます。
インプリシットフロー
アクセストークンは認可エンドポイントから発行されるため、プロパティを渡せるのは/auth/authorization/issue だけです。
-
response_type=tokenの認可リクエストを/auth/authorizationAPI に渡し、レスポンスからticketを取得します。 -
/auth/authorization/issueAPI でアクセストークンを発行します。プロパティはここで渡します。プロパティは、リダイレクト URI のフラグメントにaccess_tokenと並んで付加され、クライアントへ渡ります。
クライアントクレデンシャルズフロー
認可エンドポイントを経由しないため、プロパティはトークンリクエストとともに/auth/token へ渡します。
リソースオーナーパスワードクレデンシャルズフロー
トークンの発行が 2 段階に分かれており、プロパティを渡せるのは 2 番目の呼び出しだけです。-
トークンリクエストを
/auth/tokenAPI に渡します。レスポンスにはaction: PASSWORDと、クライアントが送信したusernameおよびpasswordがそのまま含まれます。認可サーバーはこれらでユーザー認証を行います。grant_typeがpasswordの場合、/auth/tokenに渡したプロパティは破棄されます。プロパティは/auth/token/issueに渡してください。 -
ユーザー認証が完了したら、/auth/token/issue API でアクセストークンを発行します。認証されたユーザーを
subjectに、ひもづけるプロパティをpropertiesに指定します。
リフレッシュトークンフロー
grant_type=refresh_token で /auth/token に渡したプロパティは、そのリフレッシュトークンがひもづくアクセストークンが既に持つプロパティにマージされます。新しいキーは追加され、既にあるキーはここで渡した値で上書きされます。以下のリフレッシュトークンは認可コードフローで発行されたもので、そのアクセストークンは example_parameter と additional_parameter を持っています。
制限事項
キーの値
以下の値は認可サーバーから返される応答に含まれるパラメーター群として、 RFC 6749 と OpenID Connect Core 1.0 にて予約されているため、キーとして指定できません。指定された場合には Authlete サーバーが破棄します。- access_token
- token_type
- expires_in
- refresh_token
- scope
- error
- error_description
- error_uri
- id_token
プロパティの値
指定可能な値は文字列のみです。真偽値や配列等は指定できません。サイズ
指定されたプロパティー群は、次のような処理を経て Authlete サーバー側のデータベース内に保存されます。最終的に生成された文字列の長さが 65,535 を超える場合にはエラーとなります。-
三次元の文字列に変換する
- 例:[[“example_parameter”,“example_value”,null]] (hidden の値は null か空文字列に変換されます。それぞれ、false と true を表します。)
-
JSON 文字列に変換する
- 例: ”[[“example_parameter”:“example_value”,null]]”
- AES/CBC/PKCS5Padding で暗号化する
- base64url でエンコードする