OAuth で異なるトークンタイプが存在する理由

OAuth で異なるトークンタイプが存在する理由

現在、oAuth を処理するためのコードを作成しています (Azure Graph API を使用していますが、Google API も同様だと思います)。

API 呼び出しを行うには、有効期間が約 1 時間のアクセス トークンが必要です。アクセス トークンを取得するには、まずユーザーにアプリの使用を承認してもらう必要があります。これにより、有効期間が約 10 分の承認コードが発行されます。アクセス トークンを取得すると同時に、有効期間が通常 90 日のリフレッシュ トークンも取得できます。ただし、有効なリフレッシュ トークンを保持するために、有効期限が切れる前に新しいリフレッシュ トークンを取得できます。

したがって、処理するコード/トークンには 3 つの種類があります。

なぜこれらすべての異なるコードとトークンが必要なのでしょうか? 有効期間が 90 日間の認証コードを提供してそれで済ませないのはなぜでしょうか?

リフレッシュ トークンの有効期限が切れた場合は、チェーンの最初に戻ってユーザーに再度アクセスを要求する必要があると考えてよいですか?

答え1

なぜこれらすべての異なるコードとトークンが必要なのでしょうか? 有効期間が 90 日間の認証コードを提供してそれで済ませないのはなぜでしょうか?

認証コードは、アクセス トークンを配信するいくつかの方法の 1 つです。これは、別の「ステップ」ではなく、初期の「対話型認証」フローの一部です。コードを使用するには、OAuth2 クライアント シークレット (または最初に生成された PKCE チャレンジ) も必要になるという点で、実際のアクセス トークンとは異なります。理論上、これは、コード自体が傍受された場合でも (たとえば、クライアント側でリダイレクトが見えるなど)、元のアプリだけがそれを実際のトークンと交換できることを意味します。

トークンを使用しないフローもあります。たとえば、「暗黙の付与」フローを使用してアクセス トークンを直接受信したり、OAuth IDP のサポート内容に応じて、証明書を使用して 1 つの手順で認証してトークンを受信したりすることができます。

(たとえば、Google の「サービス アカウント」は、アクセス トークンを取得するために RSA キー ペアを使用して認証します。対話型認証フローは使用しないため、認証コードはありません。)

リフレッシュ トークンの有効期限が切れた場合は、チェーンの最初に戻ってユーザーに再度アクセスを要求する必要があると考えてよいですか?

はい、しかし、そもそもそれを回避することがリフレッシュ トークンの目的です。

トークンの種類が1種類(アクセストークン)しかない場合、有効期限が切れるたびにチェーンの先頭に戻る必要があります。これは通常、リフレッシュトークンを使用することで回避できます。リフレッシュトークンには、通常、もっと長く有効期間。たとえば、アクセス トークンが数時間または数日間有効な場合、リフレッシュ トークンは数か月または数年間有効になるのが一般的です。

リフレッシュ トークンの有効期間が 90 日というのは異常に短く、ある意味、リフレッシュ トークンを持つ意味を失っていると思います。私の推測では、Azure OAuth2 は、デバイス証明書や「Windows Hello」が使用するカスタム HMAC スキームなど、盗みにくい資格情報を使用して再認証を強制するために、そのように特別に設定されているのだと思います。(対照的に、Google が発行するリフレッシュ トークンには、実質的に有効期限がないようです。私は何年も同じトークンを使用して Gmail IMAP にアクセスしています。)

答え2

さまざまなタイプがあるのは、それぞれが異なる目的を果たすためです。これらが存在する理由は、セキュリティが侵害されてさまざまな目的に使用される可能性があるためです。したがって、これらの有効期限を短くすることで、不適切な処理やセキュリティが侵害されたクライアントが、依然として悪質ではあるものの、影響を少なくすることができます。

また、何が何を行うかを分離することでも役立ちます。トークンが 1 つだと、トークンを 1 つ入手するだけですべてを実行できます。トークンが複数あると、すべてを実行するオプションを入手するのが少し難しくなります。

見るRFC 6749トークンの種類の詳細については、こちらをご覧ください。

関連情報