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

はじめに


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


スコープ単位でのトークンの有効期間設定


Authlete 1.1 では、アクセス (リフレッシュ) トークンの有効期間はサービス (認可サーバー) 単位でのみ設定可能な項目でしたが、Authlete 2.0 以降では、スコープ単位でもトークンの有効期間の設定が可能となりました。

これにより認可サーバーは「write スコープは重要度の高い権限なので、write スコープがリクエストされた場合に払い出されるトークンの有効期間は短くしたい。」といったユースケースにも対応できるようになります。

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


別記事「トークンの有効期間の計算ロジック」をご覧ください。

設定


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

image.png 51.15 KB


実行例


ここでは、ある 1 つのサービスに 2 つのスコープが設定されている環境において、アクセストークンの有効期間が以下の通り設定されているものとします。
エンティティ
アクセストークンの有効期間(秒)
サービス
86,400
read スコープ
3,600
write スコープ
600


この状況において、クライアントから送信された、スコープの組み合わせが異なる「インプリシットグラントフローの認可リクエスト」に対し、Authlete の /auth/authorization/issue API は以下のレスポンスを返却します。

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

{
  "type":"authorizationIssueResponse",
  "accessTokenDuration":86400,
  "responseContent":"https://client.example.org/cb/example.com
    #access_token=xbNhif-bsWOPyRasrEFUFurBSQUHnarjv6sMz8cSDjg
     &token_type=Bearer
     &expires_in=86400
     &scope=",
  ...
}

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

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

{ 
  "type":"authorizationIssueResponse",
  "accessTokenDuration":3600,
  "responseContent":"https://client.example.org/cb/example.com
    #access_token=8ihMgxhMf-HYBy-O2rYVlMHEQD7WcvFGUhaXfP3YZHs
     &token_type=Bearer
     &expires_in=3600
     &scope=read",
  ...
}

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

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

{ 
  "type":"authorizationIssueResponse",
  "accessTokenDuration":600,
  "responseContent":"https://client.example.org/cb/example.com#
    access_token=lZ4rjCLlwDvgO2wgOaXhDhNGMhpUE_yGi3pyTPcHFyU
     &token_type=Bearer
     &expires_in=600
     &scope=write",
  ...
}

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

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

{
  "type":"authorizationIssueResponse",
  "accessTokenDuration":600,
  "responseContent":"https://client.example.org/cb/example.com
    #access_token=3zQNzTiX5MUxO1Gy0ZFfD7mhn3U1Cg3Q15rhjNob6uc
     &token_type=Bearer
     &expires_in=600
     &scope=read+write",
  ...
}

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

How did we do with this article?