トークンの有効期間をスコープ単位で制御する

概要


本ドキュメントでは、アクセス (リフレッシュ) トークンの有効期間をスコープ単位で制御する方法について解説します。


はじめに


Authlete 1.1 では、アクセス (リフレッシュ) トークンの有効期間はサービス (認可サーバー) 単位でのみ設定可能な項目でしたが、Authlete 2.0 以降では、スコープ単位でもトークンの有効期間を設定することが可能となりました。これにより認可サーバーは「write スコープは重要度の高い権限なので、write スコープがリクエストされた場合に払い出されるトークンの有効期限は短くしたい。」といったユースケースにも対応できるようになります。

トークンの有効期間の計算ロジック


Authelte 2.0 以降におけるトークンの有効期間の計算ロジックは以下のようになります。
(ただし、以下のロジックは Authlete 2.1 以降で利用されるものとは異なりますので注意してください。詳細は「クライアント単位でトークンの有効期間を制御する (TBW)」をご覧ください。)

(便宜上、最終的な計算結果を duration と表現することにする。)

1. サービスに設定されたアクセス (リフレッシュ) トークンの有効期間秒数を取得し、これを duration の初期値とする。
2. リクエストされたスコープ群のいずれかに対して、アクセス (リフレッシュ) トークンの有効期間秒数が設定されている場合、以下の処理を行う。
  2.1. 当該スコープ群に設定されたアクセス (リフレッシュ) トークンの有効期間の中から、最小の値を取得する。
  2.2. 現在の duration の値と 2.1. で取得した値を比較し、より小さい方を duration の値として採用する。

設定


本機能を利用するためには、サービス管理画面上でスコープの属性を設定する必要があります。詳細は「スコープの属性機能」をご覧ください。

実行例


以下の実行例は、複数の条件下で implcit フローをシミュレートしアクセストークンを発行したものになります。尚、サービスの設定は以下の通りとなります。

  • サービスに設定されたアクセストークン有効期間秒数は 86400 秒とする。
  • サービスには read スコープと write スコープが定義されており、各々に設定されたアクセストークン有効期間秒数は以下の通りとする。
    • read スコープに設定されたアクセストークン有効期間秒数は 3600 秒とする。
    • write スコープに設定されたアクセストークン有効期間秒数は 600 秒とする。

1. どのスコープもリクエストされなかった場合

{
  "type":"authorizationIssueResponse",
  "accessTokenDuration":86400,
  "responseContent":"http://localhost:4180/api/mock/redirection/5191537045#access_token=xbNhif-bsWOPyRasrEFUFurBSQUHnarjv6sMz8cSDjg&token_type=Bearer&expires_in=86400&scope=",
  ...
}

=> サービスに設定されたアクセストークン有効期間秒数が利用されていることがわかる。

2. read スコープがリクエストされた場合

{ 
  "type":"authorizationIssueResponse",
  "accessTokenDuration":3600,
  "responseContent":"http://localhost:4180/api/mock/redirection/5191537045#access_token=8ihMgxhMf-HYBy-O2rYVlMHEQD7WcvFGUhaXfP3YZHs&token_type=Bearer&expires_in=3600&scope=read",
  ...
}

=> read スコープに設定されたアクセストークン有効期間秒数が利用されていることがわかる。

3. write スコープがリクエストされた場合

{ 
  "type":"authorizationIssueResponse",
  "accessTokenDuration":600,
  "responseContent":"http://localhost:4180/api/mock/redirection/5191537045#access_token=lZ4rjCLlwDvgO2wgOaXhDhNGMhpUE_yGi3pyTPcHFyU&token_type=Bearer&expires_in=600&scope=write",
  ...
}

=> write スコープに設定されたアクセストークン有効期間秒数が利用されていることがわかる。

4. read スコープと write スコープの両者がリクエストされた場合

{
  "type":"authorizationIssueResponse",
  "accessTokenDuration":600,
  "responseContent":"http://localhost:4180/api/mock/redirection/5191537045#access_token=3zQNzTiX5MUxO1Gy0ZFfD7mhn3U1Cg3Q15rhjNob6uc&token_type=Bearer&expires_in=600&scope=read+write",
  ...
}

=> write スコープに設定されたアクセストークン有効期間秒数が利用されていることがわかる。

How did we do with this article?