Validation de jeton
Pourquoi validons-nous les jetons? Lorsque votre application Web vérifie directement les données d'identification, elle vérifie que le nom d'utilisateur et le mot de passe présentés correspondent à ce que vous tenez à jour. Lorsque vous utilisez une identité basée sur des réclamations, vous sous-traitez cette tâche à un fournisseur d'identités.
La responsabilité passe de la vérification des données d'identification brutes à la vérification que le demandeur a passé par votre fournisseur d'identités privilégié et a réussi l'authentification. Le fournisseur d'identités a réussi l'authentification en émettant un jeton. Avant de pouvoir utiliser les informations ou de s'en fier comme assertion que l'utilisateur s'est authentifié, vous devez les valider.
OpenID Document d'exploration
Le protocole OpenID Connect 1.0 est une simple couche d'identité au-dessus du protocole OAuth 2.0 qui nécessite l'utilisation de plusieurs points d'extrémité pour authentifier les utilisateurs et pour demander des ressources qui incluent des informations sur les utilisateurs, des jetons et des clés publiques. Pour vous aider à découvrir quels sont ces points d'extrémité que vous devez utiliser, OpenID Connect vous permet d'utiliser un document de repérage, qui est un document JSON trouvé à un emplacement bien connu. Ce document de détection contient des paires clé-valeur qui fournissent des détails sur la configuration du fournisseur OpenID Connect, notamment les URI des points d'extrémité d'autorisation, de jeton, d'info utilisateur et de clés publiques. Vous pouvez extraire le document de détection pour le service OpenID Connect d'un domaine d'identité IAM à partir de : https://<domainURL>/.well-known/openid-configuration.
Consultez les documents de détection d'Oracle Identity Cloud Service OpenID.
Validation des jetons d'identité
Un jeton d'identité (ID) est un jeton autonome sécurisé pour l'intégrité (au format de jeton Web JSON) qui contient des revendications concernant l'utilisateur final. Il s'agit de la session d'un utilisateur authentifié. Par conséquent, le jeton doit être validé avant qu'une application puisse faire confiance au contenu du jeton d'ID. Par exemple, si un attaquant malveillant a réexécuté le jeton d'identification d'un utilisateur qu'il avait capturé précédemment, l'application doit détecter que le jeton a été réexécuté ou qu'il a été utilisé après son expiration et refuser l'authentification.
-
Vérifiez que la valeur de la revendication d'audience (
aud
) contient la valeurclient_id
de l'application. La revendicationaud
(audience) peut contenir un tableau avec plusieurs éléments. Le jeton d'ID doit être rejeté si le jeton d'ID ne liste pas le client en tant qu'audience valide, ou s'il contient des audiences supplémentaires qui ne sont pas approuvées par le client. -
Vérifiez que l'heure courante est antérieure à l'heure représentée par la revendication de délai d'expiration (
exp
). -
Vérifiez que le jeton d'identification est correctement signé par l'émetteur. Les jetons émis par le domaine d'identité IAM sont signés à l'aide d'un des certificats trouvés à l'URI spécifié dans le champ
jwks_uri
du document de détection.-
Extrayez le certificat public du locataire à partir du point d'extrémité
SigningCert/jwk
(par exemple,https://acme.identity.oraclecloud.com/admin/v1/SigningCert/jwk
).Note
Comme les domaines d'identité modifient rarement les clés publiques, vous pouvez mettre en mémoire cache les clés publiques et, dans la plupart des cas, effectuer efficacement une validation locale. Cela nécessite l'extraction et l'analyse des certificats et l'exécution des appels cryptographiques appropriés pour vérifier la signature : -
Utilisez toutes les bibliothèques JWT disponibles pour valider, par exemple, la bibliothèque JWT Nimbus de Connect2id pour Java. Voir JWT pour obtenir la liste des bibliothèques disponibles.
Note
En cas d'échec de la validation de la signature, pour empêcher les réextractions constantes en cas d'attaques avec de faux jetons, la réextraction/remise en mémoire cache de la clé publique doit être basée sur un intervalle de temps, tel que 60 minutes, de sorte que les réextractions ne se produisent que toutes les 60 minutes.
Exemple
package sample; import java.net.MalformedURLException; import java.net.URL; import com.nimbusds.jose.JWSAlgorithm; import com.nimbusds.jose.jwk.source.JWKSource; import com.nimbusds.jose.jwk.source.RemoteJWKSet; import com.nimbusds.jose.proc.JWSKeySelector; import com.nimbusds.jose.proc.JWSVerificationKeySelector; import com.nimbusds.jose.proc.SecurityContext; import com.nimbusds.jwt.JWTClaimsSet; import com.nimbusds.jwt.proc.ConfigurableJWTProcessor; import com.nimbusds.jwt.proc.DefaultJWTProcessor; public class TokenValidation { public static void main(String[] args) { try { String tokenValue = "eyJ4NXQjUzI1....W9J4oQ"; ConfigurableJWTProcessor jwtProcessor = new DefaultJWTProcessor(); // change t JWKSource keySource = new RemoteJWKSet(new URL("https://<domainURL>/admin/v1/SigningCert/jwk")); // The expected JWS algorithm of the token (agreed out-of-band) JWSAlgorithm expectedJWSAlg = JWSAlgorithm.RS256; // Configure the JWT processor with a key selector to feed matching public // RSA keys sourced from the JWK set URL JWSKeySelector keySelector = new JWSVerificationKeySelector(expectedJWSAlg, keySource); jwtProcessor.setJWSKeySelector(keySelector); // Process the token SecurityContext ctx = null; // optional context parameter, not required here JWTClaimsSet claimsSet = jwtProcessor.process(tokenValue, ctx); // Print out the token claims set System.out.println(claimsSet.toJSONObject()); } catch (Exception e) { e.printStackTrace(); } } }
-
-
Vérifiez que la valeur de la revendication d'identificateur d'émetteur (
iss
) correspond exactement à la valeur de la revendicationiss
(émetteur) :https://<domainURL>/
Validation des jetons d'accès
-
Vérifiez que le jeton d'accès est correctement signé par l'émetteur.
-
Extrayez le certificat public du locataire à partir du point d'extrémité
SigningCert/jwk
(par exemple, https://acme.identity.oraclecloud.com/admin/v1/SigningCert/jwk).Note
Comme les domaines d'identité modifient rarement les clés publiques, vous pouvez mettre en mémoire cache les clés publiques et, dans la plupart des cas, effectuer efficacement une validation locale. Cela nécessite l'extraction et l'analyse des certificats et l'exécution des appels cryptographiques appropriés pour vérifier la signature : -
Utilisez toutes les bibliothèques JWT disponibles pour valider, par exemple, la bibliothèque JWT Nimbus de Connect2id pour Java. Voir JWT pour obtenir la liste des bibliothèques disponibles.
-
Transmettez le certificat à l'API de la bibliothèque respective, par exemple, à l'aide de l'API Nimbus SignedJWT :
PublicKey = x509Certificate.getPublicKey(); // verify the signature. JWSVerifier verifier = new RSASSAVerifier((RSAPublicKey) (publicKey)); boolean isTokenValid = signedJWT.verify(verifier);
Note
En cas d'échec de la validation de la signature, pour empêcher les réextractions constantes en cas d'attaques avec de faux jetons, la réextraction/remise en mémoire cache de la clé publique doit être basée sur un intervalle de temps, tel que 60 minutes, de sorte que les réextractions ne se produisent que toutes les 60 minutes.
-
-
Vérifiez que la valeur de la revendication d'identificateur d'émetteur (
iss
) correspond exactement à la valeur de la revendicationiss
(émetteur) :https://<domainURL>/
-
Vérifiez que le jeton d'accès a la revendication d'audience (
aud
) comme demandé par le client. La valeur de la revendicationaud
passe de portée en portée. La revendicationaud
est un tableau s'il existe plusieurs publics et est une chaîne s'il n'y a qu'un seul public.La revendication
aud
est le public principal du serveur de ressources de l'application du domaine d'identité IAM. Si des publics secondaires sont définis dans l'application du domaine d'identité IAM, ils sont également ajoutés dans le cadre de la revendicationaud
. Dans le cadre de la validation du jeton d'accès, le serveur doit autoriser l'accès si l'une des valeurs du tableauaud
est pertinente pour le serveur de ressources. -
Vérifiez que l'heure courante est antérieure à l'heure représentée par la revendication de délai d'expiration (
exp
). -
Vérifiez que le jeton d'accès est autorisé à effectuer l'opération en fonction du contenu de la revendication de portée. La revendication de portée dans le jeton d'accès est une liste de chaînes séparées par des espaces.