Validation de token

Pourquoi valider les jetons ? Lorsque votre application Web vérifie directement les informations d'identification et de connexion, elle vérifie que le nom utilisateur et le mot de passe présentés correspondent à ce que vous gérez. Lorsque vous utilisez une identité basée sur les réclamations, vous sous-traitez ce travail à un fournisseur d'identités.

La responsabilité passe de la vérification des informations d'identification brutes à la vérification que le demandeur a passé par votre fournisseur d'identités préféré et a été authentifié avec succès. Le fournisseur d'identités représente une authentification réussie en émettant un jeton. Avant de pouvoir utiliser les informations ou de vous fier à celles-ci en tant qu'assertion que l'utilisateur a authentifié, vous devez les valider.

OpenID Document de repérage

Le protocole OpenID Connect 1.0 est une couche d'identité simple sur le protocole OAuth 2.0 qui nécessite l'utilisation de plusieurs adresses pour authentifier les utilisateurs et pour demander des ressources comprenant des informations utilisateur, des jetons et des clés publiques. Pour vous aider à découvrir quelles sont ces adresses que vous devez utiliser, OpenID Connect vous permet d'utiliser un document de découverte, qui est un document JSON trouvé à un emplacement connu. Ce document de repérage contient des paires clé/valeur qui fournissent des détails sur la configuration du fournisseur OpenID Connect, y compris les URI de l'autorisation, du jeton, des informations utilisateur et des adresses de clés publiques. Vous pouvez extraire le document de repérage du service OpenID Connect d'un domaine d'identité IAM à l'adresse suivante : https://<domainURL>/.well-known/openid-configuration.

Reportez-vous à la documentation sur le repérage OpenID d'Oracle Identity Cloud Service.

Validation des jetons d'identité

Un jeton d'identité (ID) est un jeton autonome sécurisé par intégrité (au format JSON Web Token) qui contient des demandes concernant l'utilisateur final. Il représente la session d'un utilisateur authentifié. Par conséquent, le jeton doit être validé pour 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'ID 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 constitue l'extension principale que OpenID Connect apporte à OAuth 2.0 pour activer l'authentification. Les jetons d'ID sont sensibles et peuvent être mal utilisés s'ils sont interceptés. Assurez-vous que ces jetons sont gérés en toute sécurité en les envoyant uniquement via HTTPS et uniquement à l'aide de données POST ou dans des 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 demande de public (aud) contient la valeur client_id de l'application. La demande aud (audience) peut contenir un tableau avec plusieurs éléments. Le jeton d'ID doit être rejeté si le jeton d'ID ne répertorie pas le client en tant que public valide ou s'il contient des publics supplémentaires qui ne sont pas approuvés par le client.

  2. Vérifiez que l'heure actuelle est antérieure à l'heure représentée par la demande de délai 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 à l'URI indiqué dans le champ jwks_uri du document de repérage.
    • Extrayez le certificat public du locataire de l'adresse SigningCert/jwk (par exemple, https://acme.identity.oraclecloud.com/admin/v1/SigningCert/jwk).

      Remarque

      Etant donné que les domaines d'identité changent rarement de clés publiques, vous pouvez mettre en 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 de passer les 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. Pour obtenir la liste des bibliothèques disponibles, reportez-vous à JWT.

      Remarque

      En cas d'échec de la validation de signature, pour empêcher les réextractions constantes en cas d'attaques avec de faux jetons, la réextraction/remise en cache de la clé publique doit être basée sur un intervalle de temps, tel que 60 minutes, afin 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 demande d'identificateur d'émetteur (iss) correspond exactement à la valeur de la demande 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 informations d'identification utilisées pour accéder aux ressources OAuth protégées. Pour valider un jeton d'accès émis à partir de l'adresse d'autorisation, le client d'application doit effectuer les opérations suivantes :
Remarque

Reportez-vous à la table 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 de l'adresse SigningCert/jwk (par exemple, https://acme.identity.oraclecloud.com/admin/v1/SigningCert/jwk).

      Remarque

      Etant donné que les domaines d'identité changent rarement de clés publiques, vous pouvez mettre en 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 de passer les 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. Pour obtenir la liste des bibliothèques disponibles, reportez-vous à JWT.

    • Transmettez le certificat à l'API de la bibliothèque concernée, 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);
      
      Remarque

      En cas d'échec de la validation de signature, pour empêcher les réextractions constantes en cas d'attaques avec de faux jetons, la réextraction/remise en cache de la clé publique doit être basée sur un intervalle de temps, tel que 60 minutes, afin que les réextractions ne se produisent que toutes les 60 minutes.
  2. Vérifiez que la valeur de la demande d'identificateur d'émetteur (iss) correspond exactement à la valeur de la demande iss (émetteur) : https://<domainURL>/

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

    La revendication aud est le public principal du serveur de ressources de l'application de domaine d'identité IAM. Si des audiences secondaires sont définies dans l'application de domaine d'identité IAM, elles sont également ajoutées dans le cadre de la demande 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 groupe aud a un sens pour le serveur de ressources.

  4. Vérifiez que l'heure actuelle est antérieure à l'heure représentée par la demande de délai d'expiration (exp).

  5. Vérifiez que le jeton d'accès est autorisé à effectuer l'opération en fonction du contenu de la demande 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.