web-dev-qa-db-ja.com

OAuth 2.0アクセストークンをJWTにすることはできますか?

私が言えることから、 the OAuth 2.0 specification は、access token 取るべきだ:

トークンは、承認情報を取得するために使用される識別子を示す場合と、検証可能な方法で承認情報を自己格納する場合があります(つまり、一部のデータと署名で構成されるトークン文字列)。この仕様の範囲を超える追加の認証資格情報は、クライアントがトークンを使用するために必要になる場合があります。

アクセストークンは、抽象化レイヤーを提供し、さまざまな認証構成(ユーザー名とパスワードなど)を、リソースサーバーが理解する単一のトークンに置き換えます。この抽象化により、アクセストークンの取得に使用される許可付与よりも制限の厳しいアクセストークンの発行が可能になるだけでなく、リソースサーバーが幅広い認証方法を理解する必要がなくなります。

アクセストークンは、リソースサーバーのセキュリティ要件に基づいて、さまざまな形式、構造、および使用方法(暗号化プロパティなど)を持つことができます。 アクセストークン属性および保護されたリソースへのアクセスに使用されるメソッドは、この仕様の範囲外ですおよび RFC675 などのコンパニオン仕様で定義されています。

(強調を追加)

リンクされたRFC6750は、それ以上の特定性を提供しません。以下を示すHTTP応答本文の例があります。

{
       "access_token":"mF_9.B5f-4.1JqM",
       "token_type":"Bearer",
       "expires_in":3600,
       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA"
     }

これは、access_tokenが不透明である可能性があることを示しているようですASCIIエンコードされたテキスト JSON Web Token(JWT) などのテキスト

私の観点からは、JWT-as-access_tokenにはいくつかの望ましいプロパティがあるようです:

  • これは既知の仕様であり、かなり広く採用されており、クライアントライブラリは多くの言語で利用できます。

  • 検証済みの暗号ライブラリを使用して簡単に署名および検証できます。

  • JSONにデコードできるため、トークン自体にトークンに関するメタデータと情報を含めることができます。

私の質問は次のとおりです。最初に、アクセストークンがJWTであっても問題ありませんか?第2に、仕様に従って許可されている場合、JWTをアクセストークンとして使用することを悪い考えとする追加の考慮事項はありますか?

23
bjmc

A1:JWTをアクセストークンとして使用することは、仕様でフォーマットが制限されていないため、仕様で許可されています。

A2:JWTをアクセストークンとして使用する背後にある考え方は、JWTを自己完結型にできるため、ターゲットがアクセストークンを検証し、承認サーバーに戻らなくても関連コンテンツを使用できるということです。これは素晴らしいプロパティですが、取り消しを難しくします。したがって、システムがアクセスを即座に取り消す機能を必要とする場合、JWTはおそらくアクセストークンとして適切な選択ではありません(ただし、JWTの寿命を短くすることでかなり遠くまで到達できます)。

28
Hans Z.

Authorization ServerとResource Serverがアクセストークンの意味に同意している限り、コンテンツが何であるかは問題ではありません。したがって、問題が発生する可能性がある唯一の理由は、これら2つのサーバーを実装するときに異なるライブラリまたはフレームワークを使用していた場合です。

3
jwismar