Skip to content

Commit a099311

Browse files
authored
Merge branch 'main' into pb/typ_values
2 parents b9de7d1 + 0bc7bce commit a099311

File tree

1 file changed

+58
-6
lines changed

1 file changed

+58
-6
lines changed

draft-ietf-oauth-attestation-based-client-auth.md

+58-6
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ normative:
4141
target: "https://www.iana.org/assignments/http-fields/http-fields.xhtml"
4242
informative:
4343
RFC6749: RFC6749
44+
RFC9334: RFC9334
4445
RFC7523: RFC7523
4546
ARF:
4647
title: "The European Digital Identity Wallet Architecture and Reference Framework"
@@ -120,6 +121,56 @@ Client Instance:
120121
Client Instance Key:
121122
: A cryptographic asymmetric key pair that is generated by the Client Instance where the public key of the key pair is provided to the client backend. This public key is then encapsulated within the Client Attestation JWT and is utilized to sign the Client Attestation Proof of Possession.
122123

124+
# Relation to RATS
125+
126+
The Remote Attestation Procedures (RATS) architecture defined by {{RFC9334}} has some commonalities to this document. The flow specified in this specification relates to the "Passport Model" in RATS. However, while the RATS ecosystem gives explicit methods and values how the RATS Attester proves itself to the Verifier, this is deliberately out of scope for Attestation-Based Client Authentication. Additionally, the terminology between RATS and OAuth is different:
127+
128+
- a RATS "Attester" relates to an OAuth "Client"
129+
- a RATS "Relying Party" relates to an OAuth "Authorization Server or Resource Server"
130+
- a RATS "Verifier" relates to the "Client Backend" defined in this specification
131+
- a RATS "Attestion Result" relates to the "Client Attestation JWT" defined by this specification
132+
- a RATS "Endorser", "Reference Value Provider", "Endorsement", "Evidence" and "Policies and Reference Values" are out of scope for this specification
133+
134+
# Client Attestation
135+
136+
This draft introduces the concept of client attestations to the OAuth 2 protocol, using two JWTs: a Client Attestation and a Client Attestation Proof of Possession (PoP). These JWTs are transmitted via HTTP headers in an HTTP request from a Client Instance to an Authorization Server or Resource Server. The primary purpose of these headers is to authenticate the Client Instance.
137+
138+
## Client Attestation HTTP Headers {#headers}
139+
140+
A Client Attestation JWT and Client Attestation PoP JWT is included in an HTTP request using the following request header fields.
141+
142+
OAuth-Client-Attestation:
143+
: A JWT that conforms to the structure and syntax as defined in [](#client-attestation-jwt)
144+
145+
OAuth-Client-Attestation-PoP:
146+
: A JWT that adheres to the structure and syntax as defined in [](#client-attestation-pop-jwt)
147+
148+
The following is an example of the OAuth-Client-Attestation header.
149+
150+
~~~
151+
OAuth-Client-Attestation: eyJhbGciOiAiRVMyNTYiLCJraWQiOiAiMTEifQ.eyJ\
152+
pc3MiOiJodHRwczovL2NsaWVudC5leGFtcGxlLmNvbSIsInN1YiI6Imh0dHBzOi8vY2x\
153+
pZW50LmV4YW1wbGUuY29tIiwibmJmIjoxMzAwODE1NzgwLCJleHAiOjEzMDA4MTkzODA\
154+
sImNuZiI6eyJqd2siOnsia3R5IjoiRUMiLCJ1c2UiOiJzaWciLCJjcnYiOiJQLTI1NiI\
155+
sIngiOiIxOHdITGVJZ1c5d1ZONlZEMVR4Z3BxeTJMc3pZa01mNko4bmpWQWlidmhNIiw\
156+
ieSI6Ii1WNGRTNFVhTE1nUF80Zlk0ajhpcjdjbDFUWGxGZEFnY3g1NW83VGtjU0EifX1\
157+
9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
158+
~~~
159+
160+
The following is an example of the OAuth-Client-Attestation-PoP header.
161+
162+
~~~
163+
OAuth-Client-Attestation-PoP: eyJhbGciOiJFUzI1NiJ9.ewogICJpc3MiOiAia\
164+
HR0cHM6Ly9jbGllbnQuZXhhbXBsZS5jb20iLAogICJhdWQiOiAi\aHR0cHM6Ly9hcy5l\
165+
eGFtcGxlLmNvbSIsCiAgIm5iZiI6MTMwMDgxNTc4MCwKICAiZXhwIjoxMzAwODE5Mzgw\
166+
LAogICJqdGkiOiAiZDI1ZDAwYWItNTUyYi00NmZjLWFlMTktOThmNDQwZjI1MDY0IiwK\
167+
ICAibm9uY2UiIDogIjVjMWE5ZTEwLTI5ZmYtNGMyYi1hZTczLTU3YzA5NTdjMDljNCIK\
168+
fQ.coB_mtdXwvi9RxSMzbIey8GVVQLv9qQrBUqmc1qj9Bs
169+
~~~
170+
171+
Note that per {{RFC9110}} header field names are case-insensitive; so OAUTH-CLIENT-ATTESTATION, oauth-client-attestation, etc., are all valid and equivalent
172+
header field names. Case is significant in the header field value, however.
173+
123174
# Client Attestation Format
124175

125176
This draft introduces the concept of client attestations to the OAuth 2 protocol, using two JWTs: a Client Attestation and a Client Attestation Proof of Possession (PoP). The primary purpose of these JWTs is to authenticate the Client Instance. These JWTs can be transmitted via HTTP headers in an HTTP request (as described in [](#headers)) from a Client Instance to an Authorization Server or Resource Server, or via a concatenated serialization (as described in [](#alternative-representation)) to enable usage outside of the traditional OAuth2 ecosystem .
@@ -223,7 +274,7 @@ The following example is the decoded header and payload of a JWT meeting the pro
223274

224275
# Client Attestation using a Header based syntax
225276

226-
The default way to present a Client Attestation is by using the header-based syntax that can be used at different endpoints.
277+
The following section defines how a Client Attestation can be provided in an HTTP request using HTTP headers.
227278

228279
## Client Attestation HTTP Headers {#headers}
229280

@@ -272,12 +323,12 @@ token68 = 1*( ALPHA / DIGIT / "-" / "." /
272323

273324
It is RECOMMENDED that the authorization server validate the Client Attestation JWT prior to validating the Client Attestation PoP.
274325

275-
## Checking HTTP requests feature client attestations {#checking-http-requests-with-client-attestations}
326+
## Validating HTTP requests feature client attestations {#checking-http-requests-with-client-attestations}
276327

277328
To validate an HTTP request which contains the client attestation headers, the receiving server MUST ensure the following with regard to a received HTTP request:
278329

279330
1. There is precisely one OAuth-Client-Attestation HTTP request header field, where its value is a single well-formed JWT conforming to the syntax outlined in []{client-attestation-jwt}.
280-
2. There is precisely one OAuth-Client-Attestation-PoP HTTP request header field, where its value is a single well-formed JWT conforming to the syntax outlined in []{client-attestation-pop-jwt}.
331+
2. There is precisely one OAuth-Client-Attestation-PoP HTTP request header field, where its value is a single well-formed JWT conforming to the syntax outlined in [](client-attestation-pop-jwt).
281332
3. The signature of the Client Attestation PoP JWT obtained from the OAuth-Client-Attestation-PoP HTTP header verifies with the Client Instance Key contained in the `cnf` claim of the Client Attestation JWT obtained from the OAuth-Client-Attestation HTTP header.
282333

283334
## Client Attestation at the Token Endpoint {#token-endpoint}
@@ -344,7 +395,7 @@ response_type=code&state=af0ifjsldkj&client_id=s6BhdRkqt3
344395

345396
# Concatenated Serialization for Client Attestations {#alternative-representation}
346397

347-
A Client Attestation according to this specification MAY be presented using an alternative representation for cases where the header-based mechanism (as introduced in introduced in []{#headers}) does not fit the underlying protocols, e.g., for direct calls to Browser APIs.
398+
A Client Attestation according to this specification MAY be presented using an alternative representation for cases where the header-based mechanism (as introduced in introduced in [](#headers) does not fit the underlying protocols, e.g., for direct calls to Browser APIs.
348399
In those cases, a concatenated serialization of the Client Attestation and Client Attestation PoP can can be used.
349400

350401
## Concatenated Serialization Format {#format-alternative}
@@ -380,8 +431,8 @@ wvi9RxSMzbIey8GVVQLv9qQrBUqmc1qj9Bs
380431

381432
To validate a client attestation using the concatenated serialization form, the receiving server MUST ensure the following:
382433

383-
1. Before the '~' character, there exists precisely a single well-formed JWT conforming to the syntax outlined in []{client-attestation-jwt}.
384-
2. After the '~' character, there exists precisely a single well-formed JWT conforming to the syntax outlined in []{client-attestation-pop-jwt}.
434+
1. Before the '~' character, there exists precisely a single well-formed JWT conforming to the syntax outlined in [](client-attestation-jwt).
435+
2. After the '~' character, there exists precisely a single well-formed JWT conforming to the syntax outlined in [](client-attestation-pop-jwt).
385436
3. The signature of the Client Attestation PoP JWT obtained after the '~' character verifies with the Client Instance Key contained in the `cnf` claim of the Client Attestation JWT obtained before the '~' character.
386437

387438
# Implementation Considerations
@@ -485,6 +536,7 @@ This non-normative example shows a client attestations used as an wallet instanc
485536

486537
* restructured JWT Claims for better readability
487538
* added JOSE typ values for Client Attestation and Client Attestation PoP
539+
* add RATS relation
488540
* add concatenated representation without headers
489541
* add PAR endpoint example
490542
* fix PoP examples to include jti and nonce

0 commit comments

Comments
 (0)