Authorized design and assessment of OAuth 2.0 / OIDC client authentication at the token and related client-auth endpoints: none, client_secret_basic/post, client_secret_jwt, private_key_jwt, and mTLS (tls_client_auth / self_signed_tls_client_auth). Use when registering clients, reviewing AS token_endpoint_auth_methods, hardening confidential clients, or testing client-credential and assertion authentication under explicit scope.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
A direct command skips the review prompt. Inspect the source before running it.
Authorized design and assessment of OAuth 2.0 / OIDC client authentication at the token and related client-auth endpoints: none, client_secret_basic/post, client_secret_jwt, private_key_jwt, and mTLS (tls_client_auth / self_signed_tls_client_auth). Use when registering clients, reviewing AS token_endpoint_auth_methods, hardening confidential clients, or testing client-credential and assertion authentication under explicit scope.
OAuth Client Authentication Methods
How the client proves identity to the authorization server (AS)—not end-user
login and not resource-server JWT crypto alone. Focus: token_endpoint_auth_method
and equivalent binding on token, revoke, introspect, and PAR.
When To Use
Situation
Direction
Token / introspection / revocation / PAR needs client auth
This skill
Registered or discovered token_endpoint_auth_method(s)
This skill
client_secret_*, *_jwt, or mTLS client auth in scope
This skill
Public client claims none but ships a “secret”
This skill
Client-credentials (M2M) hardening
This skill
Redirect / state / code leak / mix-up
oauth-oidc-misconfiguration
PKCE challenge/verifier only
oauth-pkce-checklist
Access JWT alg/kid on RS
api-auth-and-jwt-abuse
DPoP / cert-bound access tokens
device-binding-tokens / oauth-token-binding-dpop
Keywords: client authentication, client_secret, client_assertion,
private_key_jwt, client_secret_jwt, mTLS, tls_client_auth, confidential vs
public client, RFC 6749 / 7523 / 8705.
Workflow
1. Classify client and registered method
Field
Capture
Client type
public (SPA/native) vs confidential (server/BFF/M2M)
Registered method
admin UI, dynamic registration, or metadata
Discovery
token_endpoint_auth_methods_supported
Credentials
secret, JWKS/jwks_uri, client cert DN/SAN
Auth-required endpoints
token, revoke, introspect, device, PAR
Rule: public → none (+ PKCE for auth code). Confidential → secret, JWT
assertion, or mTLS. Never treat SPA/mobile-embedded strings as confidential secrets.
2. Method map
Method
Client proof
Prefer when
none
client_id only
Public clients + PKCE
client_secret_basic
HTTP Basic id:secret
Confidential; encoding care
client_secret_post
Body id + secret
Confidential; no body logs
client_secret_jwt
HMAC JWT client_assertion
Confidential; short TTL
private_key_jwt
Asymmetric JWT assertion
Strong M2M / multi-instance
tls_client_auth
mTLS; AS maps cert → client
High-assurance gateways
self_signed_tls_client_auth
mTLS self-signed via JWKS
Dynamic software clients
POST /token HTTP/1.1
Host: as.example
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=<ID>
&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
&client_assertion=<JWT>
Assertion claims (typical): iss/sub = client_id; aud = token endpoint (or
issuer per profile); fresh exp/jti; alg pinned (HS* for secret JWT; RS/ES/EdDSA
for private_key_jwt).
3. Assessment probes (clients you control)
#
Probe
Secure behavior
1
Wrong/empty secret or missing Basic
invalid_client
2
Confidential accepts none / omitted secret
Reject (finding if accepted)
3
Public binary “secret” used as confidential
Reclassify public; policy finding
4
Wrong registered method only (basic vs post)
Reject if single method set
5
JWT: bad aud, expired, reused jti, alg none
Reject
6
private_key_jwt with unregistered key / bad kid
Reject
7
mTLS: no/wrong cert or other client’s cert
Reject
8
Token requires auth; revoke/introspect does not
Document; align all endpoints
High severity: tokens for a confidential client without valid client auth.
4. Hygiene and remediation
With code-quality-standards: one primary method per client; hash/encrypt secrets;
rotate with dual-valid window; prefer private_key_jwt or mTLS over long-lived
shared secrets; pin assertion aud; require jti + short exp; never log secrets
or full assertions; lock down dynamic registration of methods/JWKS/certs.
Public: none + PKCE (oauth-pkce-checklist); no embedded client_secret.
Confidential web: BFF holds secret/key; browser never sees it.
M2M: least-privilege scopes; short access TTL; rotate and revoke on compromise.
Routing
Need
Skill
Redirect, state, nonce, code leak, mix-up
oauth-oidc-misconfiguration
PKCE S256 / verifier binding
oauth-pkce-checklist
ID token RP validation
oidc-id-token-validation
RS JWT alg/kid/jku/claims
api-auth-and-jwt-abuse
iss/aud wrong-party acceptance
jwt-audience-issuer-checks
DPoP / cert-bound access tokens
device-binding-tokens / oauth-token-binding-dpop
Refresh rotation and storage
jwt-refresh-token-patterns
Multi-vector ATO including OAuth
account-takeover-methodology
Secure implementation and tests
code-quality-standards
Selection: how the client authenticates to the AS → this skill. Browser
flow abuse → oauth-oidc-misconfiguration. Token PoP at RS → DPoP/device skills.
Output Checklist
Client type, client_id, registered method(s), discovery support