1. ホーム
  2. oauth-2.0

[解決済み] OpenID ConnectのID Tokenの有効期限はどうなっているのでしょうか?

2022-11-14 23:18:41

質問

OpenID Connectで アクセストークン には有効期限があります。 認可コードフローでは、これは通常短時間 (たとえば 20 分) です。その後、リフレッシュトークンを使って新しいアクセストークンを要求します。

アクセストークンは IDトークン にも有効期限があります。 質問ですが、これはどのような意図があるのでしょうか?

IDトークンの有効期限がリフレッシュトークンの有効期限より短い場合、最終的にIDトークンは失効しますが、アクセストークンは有効であることを意味します。

ということなのでしょうか。

  • ID トークンに、リフレッシュ トークンの有効期限よりも長い有効期限を与える、または
  • アクセストークンと同じ有効期限を設定し、有効期限が切れたら何らかのアクションを起こす(何を?
  • ID トークンを受信したときにクライアントで消費し、それ以降は有効期限を無視するか?

その OpenID Connectの仕様 は、ID トークンを検証するときにそう言うだけです。

"The current time MUST be before the time represented by the exp Claim."

で、(おそらく)上記の3番目の選択肢をサポートします。


EDIT

OpenID ConnectはOAuth2上に構築されているため、以下の補足質問の回答は OAuth2仕様 というところに書いてあります。

expires_in
     RECOMMENDED.  The lifetime in seconds of the access token.


関連する質問として、トークンと認証コードを交換するとき、同じ仕様によると、次のようなレスポンスが返ってくるかもしれません。

{
 "access_token": "SlAV32hkKG",
 "token_type": "Bearer",
 "refresh_token": "8xLOxBtZp8",
 "expires_in": 3600,
 "id_token": "eyJhbG[...]"
}

しかし、この場合 "expires_in" は何に関係するのでしょうか? アクセストークン、リフレッシュトークン、それともIDトークンでしょうか?

(詳しくは IdentityServer3 はこれをアクセストークンの有効期限に設定します)。

解決方法は?

私の質問の背後にあるいくつかの前提が間違っていたことがわかったので、質問を書き直すよりも、ここで明らかにする方が簡単なので、私は自分自身の質問に答えています。

IDトークンは、ユーザーが認証されたことをクライアントに証明するためのものであり、その結果、彼らが誰であるかを証明するものです。

クライアントがIDトークンを受け取ると、一般的にはそれをClaimsIdentityに変換し、例えばクッキーを使ってこれを持続させます。

IDトークンは、この時点では有効期限内でなければなりません(発行されたばかりなので、そうでなければなりません)。 しかし、この後は二度と使用されないので 有効期限が切れても問題ない が有効である限り、有効期限が切れても問題ありません。 クライアントは必要な認証情報を持っており、ユーザーが再ログインするまでのセッションの長さについて、独自のポリシーを選択することができます。

質問したときの私の間違った前提は、ID トークンとアクセストークンは一緒に使用されるべきで、したがって、両方とも有効な有効期限を持つ必要があるということでした。 これはさまざまな理由から間違っています。

  • ID トークンは、クライアントへの認証にのみ使用されます (上記参照)。
  • アクセストークンは、クライアントとは何の関係もありません。 リソースにアクセスするためのもので、クライアントはリソースを呼び出す必要がある場合にのみ、それを処理します。
  • スタンドアロン MVC または WebForms アプリケーションのようなもの のみです。 は ID トークンを必要とします。 外部リソースを呼び出していない場合は、アクセスを許可するものがないため、アクセストークンは不要です。