所有権の証明( DPoP )

DPoP クライアントが公開鍵・秘密鍵ペアの所有証明を提示することで、送信者限定の OAuth トークンを取得するための仕組みを提供します。

この仕様書は現在草案段階です: https://datatracker.ietf.org/doc/html/draft-ietf-oauth-dpop-11

DPoP HTTP ヘッダー

DPoP ヘッダーは、所有権の証明に必要な重要な情報を含む、署名付きJWTです。

DPoP のJWTのJOSEヘッダーには、少なくとも以下のパラメータが含まれている必要があります:

パラメーター 説明
typ JWTのタイプ。 この値は「dpop+jwt」でなければなりません。
alg 署名アルゴリズム。 有効な値は以下の通りです: RS256、 RS384、 RS512、 PS256、 PS384、 PS512、 ES256、 ES384、 ES512
JWK 公開鍵を表すJSON Web Key(JWK)。 秘密鍵を含んではならない。

JOSEヘッダーの例:

{
  "typ": "dpop+jwt",
  "alg": "RS256",
  "jwk": {
    "kty": "RSA",
    "n": "...",
    "e": "AQAB"
  }
}

DPoP のJWTのペイロードには、少なくとも以下のクレームが含まれている必要があります:

クレーム名 説明
jti このJWTの一意の識別子。
htm JWTが添付されているリクエストの HTTP メソッド。
htu クエリ文字列およびフラグメント部分を除いた、 HTTP のターゲットURI。 これは、Pushed Authorization Request(PAR)エンドポイント、あるいはトークンエンドポイントとなります。
iat JWTの作成日時。

JWTペイロードの例:

{
  "jti": "3765f59c-43cd-4cf8-8180-73bc9ae4ff3c",
  "htm": "POST",
  "htu": "https://<tenant-hostname>/oauth2/token",
  "iat": 1661847227
}

DPoP のJWTは秘密鍵で署名されている必要があり、その署名はJWTのJOSEヘッダーに指定された公開鍵を用いて検証可能でなければなりません。 JWTの有効期限は30分を超えてはなりません。 iatclaimが存在しない exp 場合、このJWTの有効期限は、で指定された作成タイムスタンプから30分後とみなされます。

DPoPJWTは、という名前のヘッダーで送信されます。

リクエストの例:


curl -ki https://<tenantId>/oauth2/token
 -H "DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6Il..."
 -d "grant_type=client_credentials&client_secret=<secret>&client_id=<clientId>"

要求の許可

認証リクエストには、クエリパラメータまたはPOSTリクエスト本文に、JSON Web Keyのサムプリントが含まれます。

パラメーター 説明
dpop_jkt この認証リクエストに関連付けるJSON Web Keyのサムプリント。
https://<tenantId>/oauth2/authorize?grant_type=authorization_code&client_id=<clientId>&redirect_uri=<redirect_uri>&dpop_jkt=<dpop_jkt>&...

このリクエストに対して生成された認証コードは、そのサムプリントに紐付けられ、トークンリクエスト時の検証に使用されます。 これにより、コードをトークンと交換する際に、トークンリクエストに署名するための同じ秘密鍵を持たない第三者によって、認証コードが盗用され、悪用されるのを防ぐことができます。

Pushed Authorization Requests (PAR) またはリクエストオブジェクトを、 DPoP, と組み合わせて使用し、サムプリント dpop_jkt を安全な方法で送信することをお勧めします。 dpop_jktあるいは、PARを使用する場合は、.の代わりに DPoP ヘッダーを使用することもできます。 詳細は上記のセクションをご覧ください DPoP HTTP header 。 「 OpenID Connect」アプリケーションの設定時に を選択 Require pushed authorization request (PAR) することで、プッシュ型認証リクエストを強制適用できます。

トークンのリクエスト

アクセス・トークンおよびリフレッシュ・トークンのリクエストには、 DPoP HTTP ヘッダーを含める必要があります。 詳細は上記のセクションをご覧ください DPoP HTTP header

認証コードフローの場合、このJWKのサムプリントは、認証リクエスト時に送信されたJWKのサムプリント(dpop_jkt)と一致している必要があります。

リクエストの例:


curl -ki https://<tenantId>/oauth2/token
 -H "DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6Il..."
 -d "grant_type=client_credentials&client_secret=<secret>&client_id=<clientId>"

このフローを実行した結果、所有権証明に紐付けられた一連のトークンが生成されます。 これはトークンのイントロスペクションによって確認できます。

トークン・イントロスペクション

DPoP のアクセストークンを検査すると、追加のクレームが返されます。
  • DPoPbearertoken_type: の代わりに、この値は となります。
  • cnf: JWKのサムプリント確認関数は、公開鍵のハッシュ値を返します。
トークンをイントロスペクションするクライアントは、イントロスペクション jkt 応答に含まれるクレーム cnf と公開鍵のハッシュ値を照合することで、アクセストークンの DPoP バインディングを検証する必要があります。

イントロスペクションの応答例:


{
    ...,
    "cnf": {
        "jkt": "yrFAH18WFPml9e9IIo6rB_fLdFX1pdbMgIcd_fW_4aM="
    },
    "token_type": "DPoP",
    ...
}