features.attestClientAuth
draft-ietf-oauth-attestation-based-client-auth-06 - OAuth 2.0 Attestation-Based Client Authentication
Specifies whether Attestation-Based Client Authentication capabilities shall be enabled. When enabled, the authorization server shall support the attest_jwt_client_auth authentication method within the server’s clientAuthMethods configuration. This mechanism enables Client Instances to authenticate using a Client Attestation JWT issued by a trusted Client Attester and a corresponding Client Attestation Proof-of-Possession JWT generated by the Client Instance.
default value:
{ ack: undefined, assertAttestationJwtAndPop: [AsyncFunction: assertAttestationJwtAndPop], // see expanded details below challengeSecret: undefined, enabled: false, getAttestationSignaturePublicKey: [AsyncFunction: getAttestationSignaturePublicKey] // see expanded details below}(Click to expand) features.attestClientAuth options details
assertAttestationJwtAndPop
Section titled “assertAttestationJwtAndPop”Specifies a helper function that shall be invoked to perform additional validation of the Client Attestation JWT and Client Attestation Proof-of-Possession JWT beyond the specification requirements. This enables enforcement of extension profiles, deployment-specific policies, or additional security constraints.
At the point of invocation, both JWTs have undergone signature verification and standard validity claim validation. The function may throw errors to reject non-compliant attestations or return successfully to indicate acceptance of the client authentication attempt.
default value:
async function assertAttestationJwtAndPop(ctx, attestation, pop, client) { // @param ctx - koa request context // @param attestation - verified and parsed Attestation JWT // attestation.protectedHeader - parsed protected header object // attestation.payload - parsed protected header object // attestation.key - CryptoKey that verified the Attestation JWT signature // @param pop - verified and parsed Attestation JWT PoP // pop.protectedHeader - parsed protected header object // pop.payload - parsed protected header object // pop.key - CryptoKey that verified the Attestation JWT PoP signature // @param client - client making the request}challengeSecret
Section titled “challengeSecret”Specifies the cryptographic secret value used for generating server-provided challenges. This value MUST be a 32-byte Buffer instance to ensure sufficient entropy for secure challenge generation.
default value:
undefinedgetAttestationSignaturePublicKey
Section titled “getAttestationSignaturePublicKey”Specifies a helper function that shall be invoked to verify the issuer identifier of a Client Attestation JWT and retrieve the public key used for signature verification. At the point of this function’s invocation, only the JWT format has been validated; no cryptographic or claims verification has occurred.
The function MUST return a public key in one of the supported formats: CryptoKey, KeyObject, or JSON Web Key (JWK) representation. The authorization server shall use this key to verify the Client Attestation JWT signature.
default value:
async function getAttestationSignaturePublicKey(ctx, iss, header, client) { // @param ctx - koa request context // @param iss - Issuer Identifier from the Client Attestation JWT // @param header - Protected Header of the Client Attestation JWT // @param client - client making the request throw new Error('features.attestClientAuth.getAttestationSignaturePublicKey not implemented');}Example: (Click to expand) Fetching attester public keys from the attester’s hosted JWKS
import * as jose from 'jose';const attesters = new Map(Object.entries({ 'https://attester.example.com': jose.createRemoteJWKSet(new URL('https://attester.example.com/jwks')),}));function getAttestationSignaturePublicKey(ctx, iss, header, client) { if (attesters.has(iss)) return attesters.get(iss)(header); throw new Error('unsupported oauth-client-attestation issuer');}