リフレッシュトークンの継続利用設定

概要


OAuth 2.0 の「リフレッシュトークングラント」では、クライアントは認可サーバーに対し、事前に発行されたリフレッシュトークン (RT) を送信し、アクセストークン (AT) 発行を要求します。RT が有効な場合、認可サーバーは新たな AT を発行し、クライアントに返却します。

この際に利用された RT の取り扱いについては以下の選択肢があります。
  • 継続使用する(無効化しない)
  • 継続使用しない(無効化する)& 有効期間を引き継がない
  • 継続使用しない(無効化する)& 有効期限を引き継ぐ
Authlete では、設定により、いずれにも対応可能です。それぞれの特性について以下に説明します。



継続使用する場合


認可サーバーは RT を無効化せずにアクセストークンを発行し、クライアントに返却します。クライアントは同じ RT を次回のリフレッシュ要求に用います。

トークンのリフレッシュが可能な期間は、最初の RT が有効な間に限定されます。

継続使用しない & 有効期間を引き継がない場合


認可サーバーは、AT と共に新たな RT を発行し、両方をクライアントに返却します。リクエストに利用された RT については無効化します。

RT が新しくなるごとに、結果的に、AT のリフレッシュが可能な期間は延長されます。

refreshing-refresh-tokens-01_ja.png 54.5 KB



継続使用しない & 有効期間を引き継ぐ場合


認可サーバーは、AT と共に新たな RT を発行し、両方をクライアントに返却します。リクエストに利用された RT については無効化します。

RT は新しくなりますが、有効期間は古い RT を引き継ぎます。結果的に、AT のリフレッシュが可能な期間は、最初に発行された RT の残りの有効期間となります。

refreshing-refresh-tokens-03_ja.png 63.8 KB




設定


Authlete サービスの「トークン」タブにある「リフレッシュトークン継続使用」にて、「継続使用する」「継続使用しない」のいずれかを選択します。

継続使用しない」を選択した場合には、さらに「リフレッシュトークン有効期間引継」の「有効」「無効」を指定できます。
image.png 38.5 KB

実行例


以下は、クライアントからの、RT (<refresh_token_1>)  を用いたトークンリクエストに対して、Authlete がどのようなレスポンスを返却するかの例です。

  • リクエスト
認可サーバーは、Authlete の /auth/token API に、RT を含むトークンリクエストを処理するよう、リクエストを送信します。以下は curl を用いる例です。(読みやすさのために折り返しています)

curl -s -X POST .../auth/token
 -u $apiKey:$apiSecret
 -H 'Content-type: application/json'
 -d '{"clientId":"...",
      "clientSecret":"...",
      "parameters":
        "grant_type=refresh_token
         &refresh_token=<refresh_token_1>"}'

  • 「継続使用する」場合のレスポンス
リクエストに用いたものと同一の RT  (<refresh_token_1>) を返却します。有効期間は初期化されません(この例では残り 332 秒)。

{
  "type": "tokenResponse",
  "resultCode": "A053001",
  "resultMessage": 
   "[A053001] The token request (grant_type=refresh_token)
      was processed successfully.",
  "accessToken": "...",
  "action": "OK",
  "grantType": "REFRESH_TOKEN",
  "refreshToken": "<refresh_token_1>",
  "refreshTokenDuration": 332,
  "refreshTokenExpiresAt": ...,
  "responseContent": 
    "{\"access_token\":\"...\",
      \"refresh_token\":\"<refresh_token_1>\",
      \"scope\":\"payment\",
      \"token_type\":\"Bearer\",
      \"expires_in\":300}",
  "scopes": [
    "payment"
  ],
  "subject": "testuser01",
  ...
}

  • 「継続使用しない & 有効期間を引き継がない」場合のレスポンス
新たな RT  (<refresh_token_2>) を発行・返却します。また、有効期間は初期化されます(この例では 900 秒)。

{
  "type": "tokenResponse",
  "resultCode": "A053001",
  "resultMessage": 
   "[A053001] The token request (grant_type=refresh_token)
      was processed successfully.",
  "accessToken": "...",
  "action": "OK",
  "grantType": "REFRESH_TOKEN",
  "refreshToken": "<refresh_token_2>",
  "refreshTokenDuration": 900,
  "refreshTokenExpiresAt": ...,
  "responseContent": 
    "{\"access_token\":\"...\",
      \"refresh_token\":\"<refresh_token_2>\",
      \"scope\":\"payment\",
      \"token_type\":\"Bearer\",
      \"expires_in\":300}",
  "scopes": [
    "payment"
  ],
  "subject": "testuser01",
  ...
}

  • 「継続使用しない & 有効期間を引き継ぐ」場合のレスポンス
新たな RT  (<refresh_token_2>) を発行・返却します。有効期間は初期化されません(例は省略します)。
How did we do with this article?