Accueil > OpenID Connect OAuth Serveur dédié > Développer > OpenID Connect > API OpenId Connect : Point d’extrémité d’informations sur les clefs (Keys (...)

API OpenId Connect : Point d’extrémité d’informations sur les clefs (Keys Endpoint)

Le protocole OpenID Connect utilise un jeton d’identité (ID Token) fondé sur JWT. La norme décrit comment une application cliente doit valider un ID Token reçu en réponse à une demande d’authentification. Cette vérification peut se faire localement (ou sinon par introspection), ce qui nécessite d’accéder aux informations sur les clés publiques.

C’est ce que permet le

Point d’extrémité d’informations sur les clefs (Keys Endpoint)

https://oa.dnc.global/keys

Forme de la demande d’informations sur les clés

La demande ne doit être effectuée que par la méthode POST.

Le client doit inclure ses informations d’authentification telles que décrites à la section 2.3. du document [RFC6749].

Exemple de requête :

POST /keys HTTP/1.1
    Host: oa.dnc.global
    Content-Type: application/x-www-form-urlencoded
    Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

Réponse

En cas de succès le serveur retourne une réponse HTTP 200.
Le corps de la réponse contient une liste de définitions des clés publiques.

Chaque définition de clé est représentée sous un format JSON telle que défini dans le document JSON Web Key (JWK).

Exemple
Voici un exemple de réponse au format JSON :
[JSON]

{"keys":[{
"kid":"618584200ef916a154008d898a1e7edc",
"kty":"RSA",
"alg":"RS256",
"use":"sig",
"e":"AQAB",
"n":"ykcWIXjQ-f61XCJutT4JcgpmmobtB0U7ZcejT8tBD8rOZPkQDYf0Q3pMjCkNT8RRKzMYtkelY2CNn3U7kVJMgbJAtvZsCdlChVHAKvRnjwh1GR_6Zpmajm5cuz4bjQWWUIPIoXe_4JbC8nCrHdaagzB_6PrV_NILyn5unG1RLOrWx7_yzLaterDKxHTCBeOlqv_5VGFey0Ecf-X7Bj8YRx6fpamK4BcEAZSAbZMtAnTckp3hOYJgZo3MOXDxSQw1YR83i5Udcoaf7sxfhEA_b7r9CeNfgj76MKM7sdCfBMI7_JSz-YU_pJKCuT9Ny3IJQ0fQHpDzSq2oD_3cDcLjfXTGM67rXElwr9l8yrSNa29UGK4q2u9cFCQmJGlxVhZU6bzs7l4202LTJdPlzm_29jwLVvtqnVJSovMLHx84ReFtus1RdKRGB2plDQccvBNvp92D9lOnM3bAu1fKRAJwNh3hg1d6k7MVCHxoo9HVnkxzW48rAAJE2nk44a2Y0cclufBhvKRdNavldS1XOyZ_qf3qCAzsuYF1VAga8I-QOb6OyXp0KGLptbyYD-ZXISGPw3pDD3aAof_PMfFhSB96GHDnm-UCRpFHndQ_fZgtZhWugU8z22rV-irYCySqVkpE0ToWbNXNFZ9Jo1GXdwkpi1WjB7S-ipjzRFOlxhwbvZ0"},
...

kid

Comme différentes applications clientes peuvent utiliser la même paire de clé publique/privée, les clés sont indexées par un identifiant "kid" plutôt que par un client_id.

Cet identifiant est notamment présent dans la charge utile du jeton JWT, ce qui permettra de sélectionner la clé publique nécessaire pour valider la signature du jeton JWT.

jwks_uri, fichier jwks.json

La norme prévoit que le document de découverte .well-known/openid_configuration définisse une constante jwks_uri donnant l’URL du fichier jwks.json, sous la forme :
"jwks_uri"        : "https://oa.dnc.global/jwks/jwks.json",

Cette URL permet d’obtenir la même information que par le Point d’extrémité d’informations sur les clefs. Cependant, ces données sont statiques, alors que l’appel au contrôleur Keys recalcule le fichier jwks.json à chaque fois afin de prendre en compte un éventuel changement.

UpdatekeysController

OAuthSD propose un point d’entrée "updatekeys" qui provoque le re-calcul des paires de clés publiques-privées de tous les clients ainsi que la mise à jour des informations sur les clés.
Ce contrôleur n’est accessible qu’à partir de la même adresse que le serveur et sera donc soit lancé localement par le Superviseur soit par une tâche CRON à l’aide de wget.

 

Notes :
- Outre le fichier jwks.json, le dossier /jwks contient un fichier au format JSON pour chaque clé publique, sous le nom <kid>.json.
- Compte-tenu de la charge de calcul nécessaire à l’établissement du fichier, l’appel au point d’extrémité Keys doit être réservé à des applications de confiance ou être protégé contre les attaques de type déni de service.
- Pour éviter le recalcul du fichier jwks.json à chaque appel de Keys, il est possible de modifier la règle de réécriture dans le fichier .htaccess pour :
RewriteRule ^keys   /jwks/jwks.json [QSA,L]
- Une clé publique peut également être lue au moyen de l’API HTTP REST + TreeQL.