Validation de jeton

Pourquoi valider les jetons ? Lorsque votre application Web vérifie les informations d'identification directement, elle vérifie que le nom utilisateur et le mot de passe présentés correspondent à ce que vous gérez. Lors de l'utilisation de l'identité basée sur les réclamations, vous confiez 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 s'est 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 d'en faire une assertion que l'utilisateur s'est authentifié, vous devez les valider.

OpenID Document de repérage

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 adresses pour authentifier les utilisateurs et pour demander des ressources incluant des informations utilisateur, des jetons et des clés publiques. Pour vous aider à repérer les adresses que vous devez utiliser, OpenID Connect vous permet d'utiliser un document de découverte, qui est un document JSON trouvé à un emplacement bien 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 des adresses d'autorisation, de jeton, d'informations utilisateur et de clés publiques. Vous pouvez extraire le document de repérage pour le service OpenID Connect d'un domaine d'identité IAM à l'adresse suivante : https://<domainURL>/.well-known/openid-configuration.

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

Validation des jetons d'identité

Un jeton d'identité (ID) est un jeton autonome et sécurisé en matière d'intégrité (au format de jeton Web JSON) qui contient des déclarations sur 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 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 qu'OpenID Connect applique à OAuth 2.0 pour activer l'authentification. Les jetons d'ID sont sensibles et peuvent être utilisés à mauvais escient s'ils sont interceptés. Assurez-vous que ces jetons sont gérés de manière sécurisée 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 d'audience (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 qu'audience valide ou s'il contient des audiences supplémentaires qui ne sont pas sécurisées par le client.

  2. Vérifiez que l'heure en cours est antérieure à l'heure représentée par la demande 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 à l'URI indiqué dans le champ jwks_uri du document de repérage.
    • Extrayez le certificat public du locataire à partir 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é publique, vous pouvez mettre en cache les clés publiques et, dans la plupart des cas, effectuer efficacement une 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 toutes les bibliothèques JWT disponibles pour valider, par exemple, la bibliothèque JWT Nimbus pour Java de Connect2id. Pour obtenir la liste des bibliothèques disponibles, reportez-vous à JWT.

      Remarque

      En cas d'échec de la validation de signature, afin d'éviter 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, 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 demande d'identificateur d'émetteur (iss) correspond exactement à la valeur de la demande iss (émetteur) : https://<domainURL>/

Validation des jetons d'accès

Pour les transactions OAuth réussies, le serveur d'autorisation OAuth du domaine d'identité doit émettre des jetons d'accès à utiliser pour authentifier un appel d'API. Un jeton d'accès représente une autorisation émise à 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 au 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 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é publique, vous pouvez mettre en cache les clés publiques et, dans la plupart des cas, effectuer efficacement une 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 toutes les bibliothèques JWT disponibles pour valider, par exemple, la bibliothèque JWT Nimbus pour Java de Connect2id. Pour obtenir la liste des bibliothèques disponibles, reportez-vous à JWT.

    • Transmettez le certificat à l'API de la bibliothèque correspondante, par exemple, à l'aide de l'API SignedJWT Nimbus :

      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, afin d'éviter 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, de sorte 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 comporte 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 demande aud est un tableau s'il existe plusieurs audiences et une chaîne s'il n'y a qu'une seule audience.

    La demande aud est l'audience principale 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 tableau aud est pertinente pour le serveur de ressources.

  4. Vérifiez que l'heure en cours est antérieure à l'heure représentée par la demande 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 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.