Validation de jeton
Pourquoi valider 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 préféré et s'est authentifié. Le fournisseur d'identités représente une authentification réussie en émettant un jeton. Avant de pouvoir utiliser les informations ou vous y fier en tant qu'assertion authentifiée par l'utilisateur, vous devez les valider.
OpenID Document de découverte
Le protocole OpenID Connect 1.0 est une couche d'identité simple au-dessus du protocole OAuth 2.0 qui nécessite l'utilisation de plusieurs points d'extrémité pour authentifier les utilisateurs et 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 détection, 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'informations d'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 la documentation sur la détection Oracle Identity Cloud Service OpenID.
Validation des jetons d'identité
Un jeton d'identité (ID) est un jeton autonome sécurisé par intégrité (au format de jeton Web JSON) qui contient des réclamations concernant l'utilisateur final. Il représente la session d'un utilisateur authentifié. Par conséquent, le jeton doit être validé avant qu'une application puisse approuver le 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 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_idde l'application. La revendicationaud(audience) peut contenir un tableau avec plus d'un élément. Le jeton d'ID doit être rejeté si le jeton d'ID ne répertorie 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 d'heure d'expiration (
exp). -
Vérifiez que le jeton d'ID est correctement signé par l'émetteur. Les jetons émis par le domaine d'identité IAM sont signés à l'aide de l'un des certificats trouvés sur l'URI spécifié dans le champ
jwks_uridu 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é changent rarement de clés publiques, vous pouvez mettre en mémoire cache les clés publiques et, dans la plupart des cas, effectuer efficacement la validation locale. Cela nécessite de récupérer et d'analyser les certificats et d'effectuer les appels cryptographiques appropriés pour vérifier la signature : -
Utilisez 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é changent rarement de clés publiques, vous pouvez mettre en mémoire cache les clés publiques et, dans la plupart des cas, effectuer efficacement la validation locale. Cela nécessite de récupérer et d'analyser les certificats et d'effectuer les appels cryptographiques appropriés pour vérifier la signature : -
Utilisez 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 comporte la revendication d'audience (
aud), comme demandé par le client. La valeur de la revendicationaudpasse de la portée à la portée. La revendicationaudest un tableau s'il existe plusieurs publics et est une chaîne s'il n'y a qu'un seul public.La réclamation
audest le public principal du serveur de ressources de l'application de domaine d'identité IAM. Si des publics secondaires sont définis dans l'application de domaine d'identité IAM, ils sont également ajoutés dans le cadre de la réclamationaud. Dans le cadre de la validation du jeton d'accès, le serveur doit autoriser l'accès si l'une des valeurs du tableauaudest pertinente pour le serveur de ressources. -
Vérifiez que l'heure courante est antérieure à l'heure représentée par la revendication d'heure 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.