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.

Le jeton d'ID est défini dans la norme OpenID Connect et est l'extension principale qu'OpenID Connect fait à OAuth 2.0 pour activer l'authentification. Les jetons d'identification sont sensibles et peuvent être utilisés à mauvais escient s'ils sont interceptés. Assurez-vous que ces jetons sont traités de manière sécurisée en les envoyant uniquement via HTTPS et uniquement en utilisant les données POST ou dans les en-têtes de demande. Si vous les stockez sur votre serveur, vous devez également les stocker en toute sécurité.
  1. Vérifiez que la valeur de la revendication d'audience (aud) contient la valeur client_id de l'application. La revendication aud (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.

  2. Vérifiez que l'heure courante est antérieure à l'heure représentée par la revendication d'heure d'expiration (exp).

  3. 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_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é 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();
            }
        }
     
    }
  4. Vérifiez que la valeur de la revendication d'identificateur d'émetteur (iss) correspond exactement à la valeur de la revendication iss (émetteur) : https://<domainURL>/

Validation des jetons d'accès

Les transactions OAuth réussies nécessitent que le serveur d'autorisation OAuth du domaine d'identité émette des jetons d'accès à utiliser pour authentifier un appel d'API. Un jeton d'accès représente une autorisation émise pour l'application client qui contient les données d'identification utilisées pour accéder aux ressources OAuth protégées. Pour valider un jeton d'accès émis à partir du point d'extrémité d'autorisation, le client d'application doit effectuer les opérations suivantes :
Note

Voir le tableau Jeton d'accès.
  1. 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.
  2. Vérifiez que la valeur de la revendication d'identificateur d'émetteur (iss) correspond exactement à la valeur de la revendication iss (émetteur) : https://<domainURL>/

  3. Vérifiez que le jeton d'accès comporte la revendication d'audience (aud), comme demandé par le client. La valeur de la revendication aud passe de la portée à la portée. La revendication aud est un tableau s'il existe plusieurs publics et est une chaîne s'il n'y a qu'un seul public.

    La réclamation aud est 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éclamation aud. Dans le cadre de la validation du jeton d'accès, le serveur doit autoriser l'accès si l'une des valeurs du tableau aud est pertinente pour le serveur de ressources.

  4. Vérifiez que l'heure courante est antérieure à l'heure représentée par la revendication d'heure d'expiration (exp).

  5. 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.