Vérifier les jetons
Contrôles à effectuer sur l'id_token et lecture des claims.
Contrôles de l’id_token
L’id_token est un JWT signé. Avant de faire confiance à son contenu :
- Vérifiez la signature avec les clés publiques du endpoint
jwks_uri(indiqué par le discovery). - Vérifiez
iss(l’émetteur du discovery),aud(votreclient_id) etexp. - Vérifiez que
nonceest celui de la transaction. - Utilisez
subcomme identifiant utilisateur propre à votre RP (aléatoire ou anonymisé, selon votre configuration).
{
"iss": "https://oidc-sandbox.a3bc.io/",
"aud": ["e251305f-5db8-11f1-8cb7-c8a3620c309f"],
"sub": "f997cfff165741f98038628f103fedb3",
"nonce": "OEozzDDlfS0qb0uidFVZVIRlBjDXUa",
"iat": 1781853814,
"exp": 1781854414,
"given_name": "JOHN",
"family_name": "DOE",
"birthdate": "1978-03-12"
}
Le jeton contient aussi des claims techniques (at_hash, auth_time, jti, sid, rat).
Userinfo
Le endpoint userinfo renvoie, avec l’access_token, les mêmes informations que l’id_token.
Claims absents
Un claim demandé mais non disponible n’est pas une erreur. Vérifiez la présence de chaque claim dont dépend votre service. Pour les claims vérifiés, regardez aussi private:*_verified : il indique comment l’information a été acquise (document, openbanking…).
Exemple de vérification
import jwt # PyJWT
jwks = jwt.PyJWKClient(JWKS_URI) # jwks_uri du discovery
key = jwks.get_signing_key_from_jwt(id_token)
claims = jwt.decode(id_token, key.key, algorithms=["RS256"],
audience=CLIENT_ID, issuer=ISSUER)
assert claims["nonce"] == expected_nonce
import { createRemoteJWKSet, jwtVerify } from "jose";
const jwks = createRemoteJWKSet(new URL(JWKS_URI)); // jwks_uri du discovery
const { payload } = await jwtVerify(idToken, jwks, { issuer: ISSUER, audience: CLIENT_ID });
if (payload.nonce !== expectedNonce) throw new Error("nonce");
jwks_uri, issuer et l’algorithme de signature dans le discovery : les valeurs ci-dessus sont des exemples.