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.

Le jeton d'ID est défini dans la norme OpenID Connect et est l'extension principale d'OpenID Connect vers 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 en toute sécurité en les envoyant uniquement via HTTPS et uniquement à l'aide des 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 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.

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

  3. 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();
            }
        }
     
    }
  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 du domaine d'identité OAuth émette des jetons d'accès à utiliser pour l'authentification d'un appel d'API. Un jeton d'accès représente une autorisation délivrée à 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é 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.
  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 a la revendication d'audience (aud) comme demandé par le client. La valeur de la revendication aud passe de portée en 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 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 revendication 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 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 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.