Utilisation de l'API d'authentification pour développer une page de connexion personnalisée

Ce cas d'utilisation fournit un exemple étape par étape d'utilisation de l'API REST des domaines d'identité pour développer une page de connexion personnalisée pour un domaine d'identité.

Note

Utilisez cette API d'authentification uniquement si vous créez votre propre expérience de connexion de bout en bout en développant une application de connexion personnalisée à utiliser par les domaines d'identité.
Note

Cette API d'authentification ne peut pas être utilisée pour intégrer vos applications à des domaines d'identité à des fins d'authentification unique.

L'API d'authentification est basée sur le concept de machine d'état. Les réponses aux demandes informent un client d'application de ce qui doit être fait ensuite plutôt que d'exiger que les utilisateurs aient activé les cookies tiers dans leur navigateur. Les témoins tiers activés dans les navigateurs peuvent poser des problèmes, en particulier pour les applications B2C où les contrôles du comportement de l'utilisateur final ne peuvent pas être appliqués. La valeur requestState fournie dans chaque réponse à la demande est utilisée dans la demande suivante, fournissant au client les informations dont il a besoin pour traiter la demande, puis fournissant le jeu d'opérations suivant autorisé.

L'API d'authentification peut :
  • Permet de vérifier les données d'identification de nom d'utilisateur et de mot de passe pour un utilisateur en tant qu'authentification principale.
  • Prise en charge de l'inscription des utilisateurs avec les facteurs d'authentification multifacteur activés par l'administrateur
  • Renforcer la sécurité de l'authentification basée sur un mot de passe à l'aide de l'authentification multifacteur (AMF) en exigeant une vérification supplémentaire, comme l'utilisation d'un code secret à usage unique basé sur le temps ou d'un code secret SMS.
  • Autorisez vos utilisateurs à sélectionner un fournisseur d'identités sociales ou SAML externe pour l'authentification.
Note

Voir la collection Postman d'API d'authentification des domaines d'identité pour des exemples de cas d'utilisation d'authentification complets. Téléchargez la collection et le fichier des variables globales à partir du dossier idcs-authn-api-rest-clients dans GitHub, puis importez-les dans Postman.

Authentifier et sur demande les codes de statut de l'API d'authentification multifacteur

Authentification auprès d'un fournisseur d'identités SAML externe

Ce cas d'utilisation décrit les étapes d'utilisation des domaines d'identité pour l'authentification à l'aide d'un fournisseur d'identités SAML externe (IdP).

Note

  • Utilisez cette API d'authentification uniquement si vous créez votre propre expérience de connexion de bout en bout en développant une application de connexion personnalisée à utiliser par les domaines d'identité.
  • Cette API d'authentification ne peut pas être utilisée pour intégrer vos applications à des domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation pour l'authentification des domaines d'identité et le fichier de variables globales à partir du dossier idcs-authn-api-rest-clients dans le référentiel idm-samples GitHub, puis importez-les dans Postman.
Pour le cas d'utilisation, procédez comme suit. Chaque étape contient des exemples de demande et de réponse :

Étape 1 : Démarrer le flux d'authentification

Un utilisateur ouvre une fenêtre de navigateur pour accéder à une page protégée.

En arrière-plan, la demande d'authentification est interceptée par les domaines d'identité et redirigée vers le point d'extrémité /authorize. Cela commence le processus d'authentification. Au lieu de présenter la page de connexion par défaut, les domaines d'identité répondent en créant et en soumettant un formulaire HTML contenant les paramètres loginCtx et signature au navigateur.
Note

Vous devez exposer un point d'extrémité pour recevoir la publication du formulaire et lire les deux valeurs de paramètre.

Exemple de formulaire HTML POST

Voici un exemple de formulaire HTML POST que les domaines d'identité retournent pour appeler la page de connexion personnalisée :

<form name="autosubmit" id="autosubmit" action="<custom_ui_signin_URL>" method="POST" onload="submitform();">
     <input name="loginCtx" value="<obfuscated_loginctx_value>" />
     <input name="signature" value="signature_data" />
</form>
Le navigateur reçoit le code HTML, qui contient JavaScript pour soumettre automatiquement le formulaire à la page de connexion personnalisée. Comme le paramètre loginCtx est chiffré à based64, l'application de connexion personnalisée doit déchiffrer loginCtx en procédant comme suit :
  • Décoder à l'aide d'un décodeur base64 pour obtenir les données binaires chiffrées
  • Utiliser le nom du locataire et générer une clé pour le déchiffrement
  • Déchiffrer les données à l'aide de la clé et des données binaires

Exemple de logique de déchiffrement pour loginCtx chiffré dans Java

Voici un exemple de logique de déchiffrement :

public static String decrypt(String tenantName, String attrName, String attrDecryptValue ) {
        String attrDecrypt = attrDecryptValue;
        final String SHA_256_ALG = "SHA-256";
        final String ENCRYPTION_ALG = "AES/CBC/PKCS5Padding";
        final String SECRET_KEY_ALG = "AES";
        String data = null;
        MessageDigest md = null;
        byte[] keyBytes = new byte[16];
        try {
            md = JCECryptoCache.getMessageDigestInstance(SHA_256_ALG);
            byte[] digest = md.digest(tenantName.toLowerCase().getBytes("UTF-8"));
            System.arraycopy(digest, 0, keyBytes, 0, 16);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            JCECryptoCache.releaseMessageDigestInstance(md);
        }
 
        // encrypt the data
        Cipher decipher = null;
        try {
            decipher = JCECryptoCache.getCipherInstance(ENCRYPTION_ALG);
            SecretKey secretKey = new SecretKeySpec(keyBytes, SECRET_KEY_ALG);
            decipher.init(Cipher.DECRYPT_MODE,
                    secretKey, new IvParameterSpec(new byte[16]));
            byte[] decryptedData = decipher.doFinal(Base64.getDecoder().decode(attrDecrypt.getBytes("UTF-8")));
            data = new String(decryptedData);
            System.out.println("" + data);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return data;
    }

Exemple de réponse

La réponse doit être similaire à l'exemple suivant :

{
  "requestState": "TasNtIxDqWOfDKeTM",
  "nextOp": [
    "credSubmit",
    "chooseIDP"
  ],
  "nextAuthFactors": [
    "IDP",
    "USERNAME_PASSWORD"
  ],
  "status": "success",
  "ecId": "GmY95180000000000",
  "USERNAME_PASSWORD": {
    "credentials": [
      "username",
      "password"
    ]
  },
  "IDP": {
    "configuredIDPs": [
      {
        "iconUrl": "null",
        "idpName": "adc00peq",
        "idpType": "Saml"
      },
      {
        "idpId": "4bb89888feea4b00a0fab3a1a5627539",
        "idpName": "Google",
        "idpType": "Social"
      }
    ],
    "credentials": [
      "idpId",
      "idpType"
    ]
  }
}
Le paramètre loginCtx contient des attributs importants :
  • requestState : État du processus d'authentification. Il doit être utilisé dans les futurs POST et GET pour les points d'extrémité d'API d'authentification de domaines d'identité.
  • nextOp : Opération suivante que l'application de connexion personnalisée doit effectuer.
  • nextAuthFactors : Facteurs d'authentification possibles que la page de connexion doit présenter.

Les valeurs de ces attributs définissent le facteur d'authentification, les fournisseurs d'identités et les fournisseurs de médias sociaux qui sont présentés dans la page de connexion. La page de connexion apparaît contenant les valeurs déchiffrées du paramètre loginCtx avec le jeton d'accès. La page de connexion comprend JavaScript qui est utilisé pour effectuer des appels AJAX aux domaines d'identité.

Étape 2 : Sélectionner un fournisseur d'identités SAML

L'utilisateur sélectionne le fichier SAML externe IdP à utiliser pour l'authentification à partir de la page de connexion personnalisée qui s'affiche. La page de connexion personnalisée doit construire, puis soumettre les informations requises pour IdP sélectionné en tant que FORM POST HTML au point d'extrémité /sso/v1/sdk/idp. Pour cette étape, les attributs suivants doivent être inclus :
  • requestState: reçu dans la réponse de l'étape 1
  • Nom idpName: de IdP reçu dans la réponse de l'étape 1
  • Type idpType: de IdP reçu dans la réponse de l'étape 1 (dans cet exemple, il s'agit de SAML)
  • ID idpId: de IdP reçu dans la réponse de l'étape 1
  • Nom appName: de l'application à laquelle le client veut accéder
  • ID client clientID: de l'application à laquelle le navigateur tente d'accéder
  • Paramètre authorization: requis pour le fournisseur d'identités sécurisé

Exemple de code POST de formulaire HTML pour sélectionner un fichier SAML IdP

L'exemple JavaScript suivant montre comment sélectionner le fichier SAML IdP :
var addParamValues = function(myform, value, paramName) {
    if (value !== null && value !== 'undefined') {
        param = document.createElement("input");
        param.value = value;
        param.name = paramName;
        myform.appendChild(param);
    }
};
 
var chooseRemoteIDP = function(name, idpId, type) {
    var myform = document.createElement("form");
    myform.action = GlobalConfig.idcsBaseURL + "/sso/v1/sdk/secure/idp";
    myform.method = "post";
    <%
        Credentials creds = CredentialsList.getCredentials().get(attr);
        String clientId = creds.getId();
    %>
    var clientId = '<%=clientId%>';
    addParamValues(myform, name, "idpName");
    addParamValues(myform, type, "idpType");
    addParamValues(myform, idpId, "idpId");
    addParamValues(myform, clientId, "clientId");
    addParamValues(myform, authorization, "accesstoken")
    addParamValues(myform, GlobalConfig.requestState, "requestState");
    document.body.appendChild(myform);
    myform.submit();
};
 
var activateIdp = function(name, idpId) {
    chooseRemoteIDP(name, idpId, "SAML");
};
 
var activateSocialIdp = function(name, idpId) {         
    chooseRemoteIDP(name, idpId, "SOCIAL");
};

Exemple de demande

Voici un exemple du contenu du FORM POST vers le point d'extrémité /sso/v1/sdk/secure/idp :

requestState=value&idpName=value&idpType=SAML&idpId=value&appName=name&clientID=value&authorization=accesstoken

Exemple de réponse

L'exemple suivant montre le contenu de la réponse dans le format HTTP standard :

HTTP/1.1 302 See Other
Date: Tue, 30 Oct 2018 04:40:05 GMT
Content-Length: 0
Connection: keep-alive
Pragma: no-cache
Location: https://<domainURL>/idp/sso (Example URL)
Set-cookie: ORA_OCIS_REQ_1=+fxgW2P7bgQayiki5P;Version=1;Path=/;Secure;HttpOnly
Expires: Sat, 01 Jan 2000 00:00:00 GMT
X-xss-protection: 1; mode=block
X-content-type-options: nosniff

Les domaines d'identité traitent la demande et redirigent le navigateur vers l'adresse IdP externe sélectionnée pour authentification et autorisation. Lorsque IdP externe est terminé, le navigateur est redirigé vers les domaines d'identité. Les domaines d'identité valident la réponse à l'assertion et vérifient si une authentification supplémentaire telle que l'authentification multifacteur est requise.

Si aucune authentification supplémentaire n'est requise, les domaines d'identité créent la session et redirigent le navigateur vers l'URL cible. Ou, les domaines d'identité créent une soumission automatique HTML FORM POST à la page de connexion personnalisée contenant authnToken. La page de connexion personnalisée crée ensuite la session. Voir Création d'une session.

Authentification auprès d'un fournisseur d'identités sociales

Ce cas d'utilisation décrit les étapes d'utilisation des domaines d'identité pour l'authentification à l'aide d'un fournisseur d'identités sociales (IdP) tel que Facebook ou Google.

Note

  • Utilisez cette API d'authentification uniquement si vous créez votre propre expérience de connexion de bout en bout en développant une application de connexion personnalisée à utiliser par les domaines d'identité.
  • Cette API d'authentification ne peut pas être utilisée pour intégrer vos applications à des domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation pour l'authentification des domaines d'identité et le fichier de variables globales à partir du dossier idcs-authn-api-rest-clients dans le référentiel idm-samples GitHub, puis importez-les dans Postman.
Pour le cas d'utilisation, procédez comme suit. Chaque étape contient des exemples de demande et de réponse :

Étape 1 : Démarrer le flux d'authentification

Un utilisateur ouvre une fenêtre de navigateur pour accéder à une page protégée.

En arrière-plan, la demande d'authentification est interceptée par les domaines d'identité et redirigée vers le point d'extrémité /authorize. Cela commence le processus d'authentification. Au lieu de présenter la page de connexion par défaut, les domaines d'identité répondent en créant et en soumettant un formulaire HTML contenant les paramètres loginCtx et signature au navigateur.
Note

Vous devez exposer un point d'extrémité pour recevoir la publication du formulaire et lire les deux valeurs de paramètre.

Exemple de formulaire HTML POST

Voici un exemple de formulaire HTML POST que les domaines d'identité retournent pour appeler la page de connexion personnalisée :

<form name="autosubmit" id="autosubmit" action="<custom_ui_signin_URL>" method="POST" onload="submitform();">
     <input name="loginCtx" value="<obfuscated_loginctx_value>" />
     <input name="signature" value="signature_data" />
</form>
Le navigateur reçoit le code HTML, qui contient JavaScript pour soumettre automatiquement le formulaire à la page de connexion personnalisée. Comme le paramètre loginCtx est chiffré à based64, l'application de connexion personnalisée doit déchiffrer loginCtx en procédant comme suit :
  • Décoder à l'aide d'un décodeur base64 pour obtenir les données binaires chiffrées
  • Utiliser le nom du locataire et générer une clé pour le déchiffrement
  • Déchiffrer les données à l'aide de la clé et des données binaires

Exemple de logique de déchiffrement pour loginCtx chiffré dans Java

Voici un exemple de logique de déchiffrement :

public static String decrypt(String tenantName, String attrName, String attrDecryptValue ) {
        String attrDecrypt = attrDecryptValue;
        final String SHA_256_ALG = "SHA-256";
        final String ENCRYPTION_ALG = "AES/CBC/PKCS5Padding";
        final String SECRET_KEY_ALG = "AES";
        String data = null;
        MessageDigest md = null;
        byte[] keyBytes = new byte[16];
        try {
            md = JCECryptoCache.getMessageDigestInstance(SHA_256_ALG);
            byte[] digest = md.digest(tenantName.toLowerCase().getBytes("UTF-8"));
            System.arraycopy(digest, 0, keyBytes, 0, 16);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            JCECryptoCache.releaseMessageDigestInstance(md);
        }
 
        // encrypt the data
        Cipher decipher = null;
        try {
            decipher = JCECryptoCache.getCipherInstance(ENCRYPTION_ALG);
            SecretKey secretKey = new SecretKeySpec(keyBytes, SECRET_KEY_ALG);
            decipher.init(Cipher.DECRYPT_MODE,
                    secretKey, new IvParameterSpec(new byte[16]));
            byte[] decryptedData = decipher.doFinal(Base64.getDecoder().decode(attrDecrypt.getBytes("UTF-8")));
            data = new String(decryptedData);
            System.out.println("" + data);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return data;
    }

Exemple de réponse

La réponse doit être similaire à l'exemple suivant :

{
  "requestState": "TasNtIxDqWOfDKeTM",
  "nextOp": [
    "credSubmit",
    "chooseIDP"
  ],
  "nextAuthFactors": [
    "IDP",
    "USERNAME_PASSWORD"
  ],
  "status": "success",
  "ecId": "GmY95180000000000",
  "USERNAME_PASSWORD": {
    "credentials": [
      "username",
      "password"
    ]
  },
  "IDP": {
    "configuredIDPs": [
      {
        "iconUrl": "null",
        "idpName": "adc00peq",
        "idpType": "Saml"
      },
      {
        "idpId": "4bb89888feea4b00a0fab3a1a5627539",
        "idpName": "Google",
        "idpType": "Social"
      }
    ],
    "credentials": [
      "idpId",
      "idpType"
    ]
  }
}
Le paramètre loginCtx contient des attributs importants :
  • requestState : État du processus d'authentification. Il doit être utilisé dans les futurs POST et GET pour les points d'extrémité d'API d'authentification de domaines d'identité.
  • nextOp : Opération suivante que l'application de connexion personnalisée doit effectuer.
  • nextAuthFactors : Facteurs d'authentification possibles que la page de connexion doit présenter.

Les valeurs de ces attributs définissent le facteur d'authentification, les fournisseurs d'identités et les fournisseurs de médias sociaux qui sont présentés dans la page de connexion. La page de connexion apparaît contenant les valeurs déchiffrées du paramètre loginCtx avec le jeton d'accès. La page de connexion comprend JavaScript qui est utilisé pour effectuer des appels AJAX aux domaines d'identité.

Étape 2 : Sélectionner un fournisseur d'identités sociales

L'utilisateur sélectionne le fichier social IdP à utiliser pour l'authentification à partir de la page de connexion personnalisée qui s'affiche. La page de connexion personnalisée doit construire, puis soumettre les informations requises pour IdP sélectionné en tant que FORM POST HTML au point d'extrémité /sso/v1/sdk/idp. Pour cette étape, les attributs suivants doivent être inclus :
  • requestState: reçu dans la réponse de l'étape 1
  • Nom idpName: de IdP reçu dans la réponse de l'étape 1
  • Type idpType: de IdP reçu dans la réponse de l'étape 1 (dans cet exemple, il s'agit de Social)
  • ID idpId: de IdP reçu dans la réponse de l'étape 1
  • Nom appName: de l'application à laquelle le client veut accéder
  • ID client clientID: de l'application à laquelle le navigateur tente d'accéder
  • Paramètre authorization: requis pour le fournisseur d'identités sécurisé

Exemple de code POST de formulaire HTML pour sélectionner un fichier social IdP

L'exemple JavaScript suivant montre comment sélectionner les médias sociaux IdP :
var addParamValues = function(myform, value, paramName) {
    if (value !== null && value !== 'undefined') {
        param = document.createElement("input");
        param.value = value;
        param.name = paramName;
        myform.appendChild(param);
    }
};
 
var chooseRemoteIDP = function(name, idpId, type) {
    var myform = document.createElement("form");
    myform.action = GlobalConfig.idcsBaseURL + "/sso/v1/sdk/secure/idp";
    myform.method = "post";
    <%
        Credentials creds = CredentialsList.getCredentials().get(attr);
        String clientId = creds.getId();
    %>
    var clientId = '<%=clientId%>';
    addParamValues(myform, name, "idpName");
    addParamValues(myform, type, "idpType");
    addParamValues(myform, idpId, "idpId");
    addParamValues(myform, clientId, "clientId");
    addParamValues(myform, authorization, "accesstoken")
    addParamValues(myform, GlobalConfig.requestState, "requestState");
    document.body.appendChild(myform);
    myform.submit();
};
 
var activateIdp = function(name, idpId) {
    chooseRemoteIDP(name, idpId, "SAML");
};
 
var activateSocialIdp = function(name, idpId) {         
    chooseRemoteIDP(name, idpId, "SOCIAL");
};

Exemple de demande

Voici un exemple du contenu du FORM POST vers le point d'extrémité /sso/v1/sdk/secure/idp :

requestState=value&idpName=value&idpType=Social&idpId=value&appName=name&clientID=value&authorization=accesstoken

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

HTTP/1.1 302 See Other
Date: Tue, 30 Oct 2018 04:40:05 GMT
Content-Length: 0
Connection: keep-alive
Pragma: no-cache
Location: https://<domainURL>/idp/sso (Example URL)
Set-cookie: ORA_OCIS_REQ_1=+fxgW2P7bgQayiki5P;Version=1;Path=/;Secure;HttpOnly
Expires: Sat, 01 Jan 2000 00:00:00 GMT
X-xss-protection: 1; mode=block
X-content-type-options: nosniff

Les domaines d'identité traitent la demande et redirigent le navigateur vers les médias sociaux IdP sélectionnés pour authentification et autorisation. Lorsque les médias sociaux IdP sont terminés, le navigateur est redirigé vers les domaines d'identité. Les domaines d'identité valident la réponse à l'assertion et vérifient si une authentification supplémentaire telle que l'authentification multifacteur est requise.

Si aucune authentification supplémentaire n'est requise, les domaines d'identité créent la session et redirigent le navigateur vers l'URL cible. Ou, les domaines d'identité créent une soumission automatique HTML FORM POST à la page de connexion personnalisée contenant authnToken. La page de connexion personnalisée crée ensuite la session. Voir Création d'une session.

Authentification auprès d'un fournisseur d'identités SAML externe et de l'authentification multifacteur

Ce cas d'utilisation décrit les étapes d'utilisation des domaines d'identité pour l'authentification à l'aide d'un fournisseur d'identités SAML externe (IdP) et d'une authentification multifacteur (AMF).

Note

  • Utilisez cette API d'authentification uniquement si vous créez votre propre expérience de connexion de bout en bout en développant une application de connexion personnalisée à utiliser par les domaines d'identité.
  • Cette API d'authentification ne peut pas être utilisée pour intégrer vos applications à des domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation pour l'authentification des domaines d'identité et le fichier de variables globales à partir du dossier idcs-authn-api-rest-clients dans le référentiel idm-samples GitHub, puis importez-les dans Postman.
Pour le cas d'utilisation, procédez comme suit. Chaque étape contient des exemples de demande et de réponse :

Étape 1 : Démarrer le flux d'authentification

Un utilisateur ouvre une fenêtre de navigateur pour accéder à une page protégée.

En arrière-plan, la demande d'authentification est interceptée par les domaines d'identité et redirigée vers le point d'extrémité /authorize. Cela commence le processus d'authentification. Au lieu de présenter la page de connexion par défaut, les domaines d'identité répondent en créant et en soumettant un formulaire HTML contenant les paramètres loginCtx et signature au navigateur.
Note

Vous devez exposer un point d'extrémité pour recevoir la publication du formulaire et lire les deux valeurs de paramètre.

Exemple de formulaire HTML POST

Voici un exemple de formulaire HTML POST que les domaines d'identité retournent pour appeler la page de connexion personnalisée :

<form name="autosubmit" id="autosubmit" action="<custom_ui_signin_URL>" method="POST" onload="submitform();">
     <input name="loginCtx" value="<obfuscated_loginctx_value>" />
     <input name="signature" value="signature_data" />
</form>
Le navigateur reçoit le code HTML, qui contient JavaScript pour soumettre automatiquement le formulaire à la page de connexion personnalisée. Comme le paramètre loginCtx est chiffré à based64, l'application de connexion personnalisée doit déchiffrer loginCtx en procédant comme suit :
  • Décoder à l'aide d'un décodeur base64 pour obtenir les données binaires chiffrées
  • Utiliser le nom du locataire et générer une clé pour le déchiffrement
  • Déchiffrer les données à l'aide de la clé et des données binaires

Exemple de logique de déchiffrement pour loginCtx chiffré dans Java

Voici un exemple de logique de déchiffrement :

public static String decrypt(String tenantName, String attrName, String attrDecryptValue)
        {       
            String attrDecrypt = attrDecryptValue;        
            final String SHA_256_ALG = "SHA-256";       
            final String ENCRYPTION_ALG = "AES/CBC/PKCS5Padding";        
            final String SECRET_KEY_ALG = "AES";       
            String data = null;       
            MessageDigest md = null;       
            byte[] keyBytes = new byte[16];       
            try {           
                md = MessageDigest.getInstance(SHA_256_ALG);           
                byte[] digest = md.digest(tenantName.toLowerCase().getBytes("UTF-8"));           
                System.arraycopy(digest, 0, keyBytes, 0, 16);      
            } catch (Exception ex) 
            {           
              ex.printStackTrace();       
            }          
        // encrypt the data       
        Cipher decipher = null;       
        try {           
        decipher = Cipher.getInstance(ENCRYPTION_ALG);           
        SecretKey secretKey = new SecretKeySpec(keyBytes, SECRET_KEY_ALG);           
        decipher.init(Cipher.DECRYPT_MODE,           
        secretKey, new IvParameterSpec(new byte[16]));           
        byte[] decryptedData = decipher.doFinal(Base64.getDecoder().decode(attrDecrypt.getBytes("UTF-8")));           
        data = new String(decryptedData);           
        System.out.println("" + data);        }
        catch (Exception ex)
        {           
        ex.printStackTrace();       
        }       
        return data;   
       }

Exemple de réponse

La réponse doit être similaire à l'exemple suivant :

{
  "requestState": "TasNtIxDqWOfDKeTM",
  "nextOp": [
    "credSubmit",
    "chooseIDP"
  ],
  "nextAuthFactors": [
    "IDP",
    "USERNAME_PASSWORD"
  ],
  "status": "success",
  "ecId": "GmY95180000000000",
  "USERNAME_PASSWORD": {
    "credentials": [
      "username",
      "password"
    ]
  },
  "IDP": {
    "configuredIDPs": [
      {
        "iconUrl": "null",
        "idpName": "adc00peq",
        "idpType": "Saml"
      },
      {
        "idpId": "4bb89888feea4b00a0fab3a1a5627539",
        "idpName": "Google",
        "idpType": "Social"
      }
    ],
    "credentials": [
      "idpId",
      "idpType"
    ]
  }
}
Le paramètre loginCtx contient des attributs importants :
  • requestState : État du processus d'authentification. Il doit être utilisé dans les futurs POST et GET pour les points d'extrémité d'API d'authentification de domaines d'identité.
  • nextOp : Opération suivante que l'application de connexion personnalisée doit effectuer.
  • nextAuthFactors : Facteurs d'authentification possibles que la page de connexion doit présenter.

Les valeurs de ces attributs définissent le facteur d'authentification, les fournisseurs d'identités et les fournisseurs de médias sociaux qui sont présentés dans la page de connexion. La page de connexion apparaît contenant les valeurs déchiffrées du paramètre loginCtx avec le jeton d'accès. La page de connexion comprend JavaScript qui est utilisé pour effectuer des appels AJAX aux domaines d'identité.

Étape 2 : Sélectionner un fournisseur d'identités externe

L'utilisateur sélectionne l'adresse IdP externe à utiliser pour l'authentification à partir de la page de connexion personnalisée qui s'affiche. La page de connexion personnalisée doit construire, puis soumettre les informations requises pour IdP sélectionné en tant que FORM POST HTML au point d'extrémité /sso/v1/sdk/idp. Pour cette étape, les attributs suivants doivent être inclus :
  • requestState: reçu dans la réponse de l'étape 1
  • Nom idpName: de IdP reçu dans la réponse de l'étape 1
  • Type idpType: de IdP reçu dans la réponse de l'étape 1 (dans cet exemple, il s'agit de SAML)
  • ID idpId: de IdP reçu dans la réponse de l'étape 1
  • Nom appName: de l'application à laquelle le client veut accéder
  • ID client clientID: de l'application à laquelle le navigateur tente d'accéder
  • Paramètre authorization: requis pour le fournisseur d'identités sécurisé

Exemple de code POST de formulaire HTML pour sélectionner un fichier IdP externe

L'exemple JavaScript suivant montre comment sélectionner une IdP externe :
var addParamValues = function(myform, value, paramName) {
    if (value !== null && value !== 'undefined') {
        param = document.createElement("input");
        param.value = value;
        param.name = paramName;
        myform.appendChild(param);
    }
};
 
var chooseRemoteIDP = function(name, idpId, type) {
    var myform = document.createElement("form");
    myform.action = GlobalConfig.idcsBaseURL + "/sso/v1/sdk/secure/idp";
    myform.method = "post";
    <%
        Credentials creds = CredentialsList.getCredentials().get(attr);
        String clientId = creds.getId();
    %>
    var clientId = '<%=clientId%>';
    addParamValues(myform, name, "idpName");
    addParamValues(myform, type, "idpType");
    addParamValues(myform, idpId, "idpId");
    addParamValues(myform, clientId, "clientId");
    addParamValues(myform, authorization, "accesstoken") 
    addParamValues(myform, GlobalConfig.requestState, "requestState");
    document.body.appendChild(myform);
    myform.submit();
};
 
var activateIdp = function(name, idpId) {
    chooseRemoteIDP(name, idpId, "SAML");
};
 
var activateSocialIdp = function(name, idpId) {         
    chooseRemoteIDP(name, idpId, "SOCIAL");
};

Exemple de demande

Voici un exemple du contenu du FORM POST vers le point d'extrémité /sso/v1/sdk/secure/idp :

requestState=value&idpName=value&idpType=SAML&idpId=value&appName=name&clientID=value&authorization=accesstoken

Exemple de réponse

L'exemple suivant montre le contenu de la réponse dans le format HTTP standard :

HTTP/1.1 302 See Other
Date: Tue, 30 Oct 2018 04:40:05 GMT
Content-Length: 0
Connection: keep-alive
Pragma: no-cache
Location: https://<domainURL>/idp/sso (Example URL)
Set-cookie: ORA_OCIS_REQ_1=+fxgW2P7bgQayiki5P;Version=1;Path=/;Secure;HttpOnly
Expires: Sat, 01 Jan 2000 00:00:00 GMT
X-xss-protection: 1; mode=block
X-content-type-options: nosniff

Les domaines d'identité traitent la demande et redirigent le navigateur vers l'adresse IdP externe sélectionnée pour authentification et autorisation. Lorsque IdP externe est terminé, il redirige le navigateur vers des domaines d'identité, qui redirige ensuite le navigateur pour commencer la vérification en 2 étapes.

Étape 3 : Authentifier à l'aide du facteur privilégié (SMS)

Les étapes initiales pour commencer la vérification en 2 étapes sont similaires à l'étape 1. Les domaines d'identité créent et soumettent un formulaire HTML contenant les paramètres loginCtx et signature chiffrés. Voir l'étape 1 pour des informations détaillées sur le formulaire POST et comment le déchiffrer.

Une fois le paramètre loginCtx déchiffré, la réponse doit être similaire à l'exemple suivant :

{
    "status": "success",
    "displayName": "Joe's iPhone",
    "nextAuthFactors": [
        "SMS"
    ],
    "SMS": {
        "credentials": [
            "otpCode"
        ]
    },
    "nextOp": [
        "credSubmit",
        "getBackupFactors",
        "resendCode"
    ],
    "requestState": "QjyV3ueFrGQCO.....84gQw2UUm2V7s",
    "trustedDeviceSettings": {
        "trustDurationInDays": 15
    }
}
Le paramètre loginCtx contient des attributs importants :
  • requestState : État du processus d'authentification. Il doit être utilisé dans les futurs POST et GET pour les points d'extrémité d'API d'authentification de domaines d'identité.
  • nextOp : Opération suivante que l'application de connexion personnalisée doit effectuer.
  • nextAuthFactors : Facteurs d'authentification possibles que la page de connexion doit présenter.

Les valeurs de ces attributs définissent le facteur d'authentification (dans cet exemple, il s'agit de SMS) à présenter dans la page de connexion. L'utilisateur entre le code secret à usage unique qu'il reçoit sur son appareil.

Les attributs suivants doivent être envoyés dans la demande :
  • op: indique au serveur le type d'opération souhaité par le client
  • otpCode: le code envoyé à l'appareil de l'utilisateur
  • requestState: reçu dans la réponse de l'étape 2

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON pour terminer l'authentification à l'aide de la méthode privilégiée :

{  
   "op":"credSubmit",
     "credentials":{  
      "otpCode":"108685"
   },
   "requestState":"{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "authnToken": "eyJraWQiOiJT.....kLbxxL97U_0Q",
    "status": "success"
}

Une session doit ensuite être créée. Une fois la session créée, le navigateur est redirigé vers l'URL demandée à l'origine. Voir Création d'une session.

Création d'une session

Ce cas d'utilisation fournit un exemple d'utilisation de domaines d'identité pour créer une session après l'authentification, par exemple après l'authentification à l'aide de l'authentification multifacteur.

Note

Utilisez cette API d'authentification uniquement si vous créez votre propre expérience de connexion de bout en bout en développant une application de connexion personnalisée à utiliser par les domaines d'identité.
Note

Cette API d'authentification ne peut pas être utilisée pour intégrer vos applications à des domaines d'identité à des fins d'authentification unique.
Note

Voir les autres cas d'utilisation sous Utilisation de l'API d'authentification pour plus d'informations sur l'utilisation de l'API d'authentification.

Soumettez authnToken et requestState en tant que FORM POST lorsque le client a terminé avec l'authentification et l'authentification multifacteur, et doit créer une session. Pour cette étape, createSession doit être répertorié en tant que valeur d'attribut nextOp dans la dernière réponse reçue et FORM POST doit inclure l'un des attributs suivants.

Pour le point d'extrémité /sso/v1/sdk/secure/session :
  • requestState: reçu dans la dernière réponse

    OR

  • authnToken: reçu dans la dernière réponse

    AND

  • Paramètre authorization: requis pour une session sécurisée

Exemple de demande

Voici un exemple du contenu du FORM POST vers le point d'extrémité /sso/v1/sdk/secure/session :

requestState=value&authorization=<client sign-in access token>
OR
authnToken=<value received from a previous response>&authorization=<client sign-in access token>

Exemple de réponse

L'exemple suivant montre le contenu de la réponse dans le format HTTP standard :

HTTP/1.1 302 See Other
Date: Tue, 30 Oct 2018 04:40:05 GMT
Content-Length: 0
Connection: keep-alive
Pragma: no-cache
Location: https://<domainURL>/idp/sso (Example URL)
Set-cookie: ORA_OCIS_REQ_1=+fxgW2P7bgQayiki5P;Version=1;Path=/;Secure;HttpOnly
Expires: Sat, 01 Jan 2000 00:00:00 GMT
X-xss-protection: 1; mode=block
X-content-type-options: nosniff

Si createSession n'est pas listé comme valeur pour le paramètre nextOp dans la dernière réponse reçue, vous devrez peut-être créer un jeton avant de créer une session. Si createSession est répertorié comme valeur pour nextOp, le point d'extrémité sdk/session peut être appelé directement à l'aide uniquement de requestState.

Exemple de demande

L'exemple suivant montre la demande de jeton au point d'extrémité /sso/v1/sdk/authenticate au format JSON :

{  
   "op":"createToken",
   "requestState":"{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "authnToken":"eyJraWQiOiJ....4IacnWKSQ",
    "status":"success"
}

Le serveur vérifie qu'aucune autre évaluation de facteur n'est nécessaire. Si aucune autre évaluation n'est requise, le jeton est envoyé dans la réponse.

Authentification avec le nom d'utilisateur et le mot de passe

Ce cas d'utilisation fournit un exemple étape par étape d'utilisation de l'API d'authentification des domaines d'identité pour l'authentification avec les données d'identification d'un utilisateur.

Note

  • Utilisez cette API d'authentification uniquement si vous créez votre propre expérience de connexion de bout en bout en développant une application de connexion personnalisée à utiliser par les domaines d'identité.
  • Cette API d'authentification ne peut pas être utilisée pour intégrer vos applications à des domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation pour l'authentification des domaines d'identité et le fichier de variables globales à partir du dossier idcs-authn-api-rest-clients dans le référentiel idm-samples GitHub, puis importez-les dans Postman.

Pour le cas d'utilisation, procédez comme suit.

Étape 1 : Démarrer le flux d'authentification

Obtenez la valeur requestState initiale pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant présente la demande au format cURL :

   curl  -X GET
   -H "Content-Type: application/json" 
   -H "Authorization: Bearer {{access_token_value}}"
   https://<domainURL>/sso/v1/sdk/authenticate?appName={{app_name}}
Note

appName est facultatif. appName est le nom de l'application à laquelle le client veut accéder. Si une valeur appName est fournie, les politiques d'authentification propres à l'application sont traitées et le client est mis au défi pour les facteurs requis en fonction de cette politique.

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "ecId": "ecId",
 "nextOp": [
        "credSubmit"
    ],
    "nextAuthFactors": [
        "USERNAME_PASSWORD"
    ],
    "USERNAME_PASSWORD": {
        "credentials": [
            "username",
            "example-password"
        ]
    },
    "requestState": "{{requestState}}"
}

Dans la réponse, la valeur nextOp indique ce qui peut être envoyé en tant que valeur op dans la demande suivante. Dans cet exemple de cas d'utilisation, credSubmit doit être envoyé à l'étape suivante. requestState contient les données contextuelles nécessaires au traitement de la demande.

Étape 2 : Soumettre les données d'identification de l'utilisateur

Soumettez les données d'identification de l'utilisateur comme premier facteur, à savoir le nom d'utilisateur et le mot de passe. Pour cette étape, le client doit inclure les attributs suivants :

  • Nom d'utilisateur et mot de passe credentials:

  • requestState: reçu dans la réponse de l'étape 1

  • op: indique au serveur le type d'opération souhaité par le client

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON :

{
   "op": "credSubmit",
   "credentials": {
      "username": "{{username}}",
      "password": "{{password}}"
   },
   "requestState": "{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "authnToken": "eyJraWQiOiJT.....UKofudtemmJE",
    "status": "success"
}

Exemple de réponse d'erreur

L'exemple suivant montre le contenu de la réponse au format JSON lorsque le nom d'utilisateur ou le mot de passe fourni n'est pas valide :

{
    "status": "failed",
    "cause": [
        {
            "message": "You entered an incorrect username or password.",
            "code": "AUTH-3001"
        }
    ],
    "requestState": "e5kwGYx57taQ.....jyg3nEDFya"
}

Authentification du nom d'utilisateur et du mot de passe avec consentement TOU

Ce cas d'utilisation fournit un exemple étape par étape d'utilisation de l'API d'authentification des domaines d'identité pour l'authentification avec les données d'identification d'un utilisateur avec le consentement TOU. Lorsque l'utilisateur accepte le consentement, il est redirigé vers cette page d'application.

Note

  • Utilisez cette API d'authentification uniquement si vous créez votre propre expérience de connexion de bout en bout en développant une application de connexion personnalisée à utiliser par les domaines d'identité.
  • Cette API d'authentification ne peut pas être utilisée pour intégrer vos applications à des domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation pour l'authentification des domaines d'identité et le fichier de variables globales à partir du dossier idcs-authn-api-rest-clients dans le référentiel idm-samples GitHub, puis importez-les dans Postman.

Étape 1 : Démarrer le flux d'authentification

Obtenez la valeur requestState initiale pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant présente la demande au format cURL :

   curl  -X GET
   -H "Content-Type: application/json" 
   -H "Authorization: Bearer {{access_token_value}}"
   https://<domainURL>/sso/v1/sdk/authenticate?appName={{app_name}}
Note

appName est facultatif. appName est le nom de l'application à laquelle le client veut accéder. Si une valeur appName est fournie, les politiques d'authentification propres à l'application sont traitées et le client est mis au défi pour les facteurs requis en fonction de cette politique.

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "ecId": "ecId",
 "nextOp": [
        "credSubmit"
    ],
    "nextAuthFactors": [
        "USERNAME_PASSWORD"
    ],
    "USERNAME_PASSWORD": {
        "credentials": [
            "username",
            "example-password"
        ]
    },
    "requestState": "{{requestState}}"
}

Dans la réponse, la valeur nextOp indique ce qui peut être envoyé en tant que valeur op dans la demande suivante. Dans cet exemple de cas d'utilisation, credSubmit doit être envoyé à l'étape suivante. requestState contient les données contextuelles nécessaires au traitement de la demande.

Étape 2 : Soumettre les données d'identification de l'utilisateur sans l'authentification multifacteur)

Soumettez les données d'identification de l'utilisateur comme premier facteur, à savoir le nom d'utilisateur et le mot de passe. Pour cette étape, le client doit inclure les attributs suivants :
  • Nom d'utilisateur et mot de passe credentials:

  • requestState: reçu dans la réponse de l'étape 1

  • op: indique au serveur le type d'opération souhaité par le client

Si le nom utilisateur et les mots de passe sont valides, le serveur répond avec l'instruction TOU dans les paramètres régionaux spécifiés dans le profil de l'utilisateur. Le serveur invite également l'utilisateur à fournir ses données d'identification de consentement dans la demande suivante. Si l'énoncé TOU n'est pas présent dans les paramètres régionaux de l'utilisateur fr, la réponse 401 avec le message d'erreur AUTH-3036 : L'énoncé des conditions d'utilisation pour les paramètres régionaux fr n'est pas ajouté s'affiche.

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON pour le point d'extrémité /sso/v1/sdk/authenticate :

{  
   "op":"credSubmit",
   "credentials":{  
      "username":"{{username}}",
      "password":"{{password}}"
   },
   "requestState":"{{requestState}}"
}
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON lors de l'ajout des paramètres régionaux de l'utilisateur :

{
  "nextOp": [
   "acceptTOU"
  ],
  "TOU": {
    "statement": "This is a placeholder text. Customers must provide the actual Terms of Use.",
    "credentials": [
    "consent"
    ],
    "locale": "en"
  },
 "requestState": "q/tRS4BFAdaimSBhq"
}
}

Exemple de réponse d'erreur

L'exemple suivant montre le contenu de la réponse au format JSON lorsque le TOU pour les paramètres régionaux de l'utilisateur n'est pas ajouté :

{
    "status": "failed",
    "ecId": "Q0ApB1Y1000000000",
    "cause": [
        {
            "message": "Terms of Use Statement for locale fr isn't added.",
            "code": "AUTH-3036"
        }
    ]
}
}

Étape 3 : Fournir le consentement TOU

Dans ce scénario, l'utilisateur accepte ou rejette les conditions d'utilisation de l'application. Si l'utilisateur accepte les conditions d'utilisation, il est redirigé vers la page de l'application.

Si l'utilisateur refuse les conditions d'utilisation, le message d'erreur 401, AUTH-3035 : Vous devez accepter les conditions d'utilisation pour accéder à cette application, s'affiche.

Exemple de demande

L'exemple suivant montre le contenu de la demande au format JSON lorsque l'utilisateur accepte TOU.

{
 "op": "acceptTOU",
 "credentials": {
   "consent": true
 },
 "requestState": "{{requestState}}"
}

Exemple de demande

L'exemple suivant montre le contenu de la demande au format JSON lorsque l'utilisateur rejette le TOU.

{
 "op": "acceptTOU",
 "credentials": {
   "consent": false
 },
 "requestState": "{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON lorsque l'utilisateur accepte l'énoncé TOU.

{
    "authnToken": "eyJ4NXQjUzI1NiI6Iks0R0hvZVdoUm...YUAvuEOrERXrQRnjybdOkA2Q",
    "status": "success",
    "ecId": "Q0ApB1Y1000000000"
}

Exemple de réponse d'erreur

Ce qui suit affiche le contenu de la réponse au format JSON lorsque l'utilisateur refuse l'utilisation.


{
    "status": "failed",
    "ecId": "Q0ApB1Y1000000000",
    "cause": [
        {
            "message": "You must accept the Terms of Use to access this application.",
            "code": "AUTH-3035"
        }
    ]
}

Authentification avec le nom d'utilisateur, le mot de passe et l'authentification multifacteur et retour d'un code secret à usage unique

Ce cas d'utilisation fournit un exemple étape par étape d'utilisation de l'API REST des domaines d'identité pour l'authentification avec les données d'identification d'un utilisateur et l'authentification multifacteur et pour retourner un code secret à usage unique chiffré dans la réponse.

Note

Utilisez cette API d'authentification uniquement si vous créez votre propre expérience de connexion de bout en bout en développant une application de connexion personnalisée à utiliser par les domaines d'identité. Cette API d'authentification ne peut pas être utilisée pour intégrer vos applications à des domaines d'identité à des fins d'authentification unique.

Téléchargez la collection d'exemples de cas d'utilisation pour l'authentification des domaines d'identité et le fichier de variables globales à partir du dossier idcs-authn-api-rest-clients dans le référentiel idm-samples GitHub, puis importez-les dans Postman.

Les domaines d'identité peuvent être configurés pour envoyer un code secret à usage unique (OTP) basé sur le temps directement à un utilisateur pour authentification ou pour que le code secret soit chiffré et envoyé au client consommateur qui peut ensuite l'envoyer à l'utilisateur pour authentification.

Par exemple, les administrateurs peuvent configurer des domaines d'identité pour envoyer des codes secrets ponctuels (OTP) basés sur le temps à l'application Oracle Mobile Authenticator (OMA) ou envoyer les codes secrets à usage unique par courriel à l'adresse de courriel principale de l'utilisateur. Dans les deux cas, les domaines d'identité génèrent le code secret à usage unique, l'envoient directement à l'utilisateur et celui-ci entre le code pour authentification. Pour comprendre comment définir ces options à l'aide de REST, voir Inscription au facteur d'authentification avec vérification de facteur-SMS et Inscription au facteur d'authentification avec vérification de facteur-Courriel.

Les administrateurs peuvent également configurer les domaines d'identité pour retourner un mot de passe à usage unique chiffré dans la réponse de l'API au client consommateur afin que le client consommateur puisse lancer ou envoyer le mot de passe à usage unique à l'utilisateur. Deux avantages de cette approche sont qu'elle permet au client consommateur de personnaliser le message d'authentification et de modifier les détails de l'expéditeur en fonction de ses besoins commerciaux. Pour configurer les domaines d'identité afin qu'ils retournent le mot de passe à usage unique chiffré dans la réponse, le client consommateur doit effectuer les étapes suivantes.
  1. Étape 1 : Créer une application CustomUI

  2. Étape 2 : Générer une paire de clés pour un certificat auto-signé

  3. Étape 3 : Configurer l'application pour retourner le mot de passe à usage unique dans la réponse

  4. Étape 4 : Demander le code secret à usage unique

Note

Ces étapes supposent que l'authentification multifacteur est activée et qu'une politique d'authentification est créée pour l'authentification multifacteur. Voir Configuration des paramètres d'authentification multifacteur.

Cryptage et déchiffrement

Cette mise en oeuvre utilise les spécifications suivantes pour chiffrer et déchiffrer le code OTP reçu. Voir PKCS #1 : Spécifications de cryptographie RSA, version 2.0, section 7.1 RSAES-OAEP.

Code de déchiffrement du mot de passe à usage unique

Utilisez le code Java suivant pour déchiffrer le code secret à usage unique.
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package decryption;

import java.security.Key;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.cert.CertificateFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import javax.crypto.Cipher;

/**
 *
 * @author <author>
 */
public class DecryptOtpCode {
    
    private static Key getPrivateKey(String privateKeyPEM) throws Exception {
        byte[] encoded = Base64.getDecoder().decode(privateKeyPEM);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
        return kf.generatePrivate(keySpec);
    }
    
    public static void main(String args[]) {
        String value = "<encrypted_value>";
        String privatekey = 
                            "<pem_privatekey_data>";
        try {
                Cipher cipherInstance =
                        Cipher.getInstance("RSA/ECB/OAEPwithSHA1andMGF1Padding");
                CertificateFactory factory = CertificateFactory.getInstance("X.509");
                byte [] decoded = Base64.getDecoder().decode(value);
                PrivateKey pKey = (PrivateKey)getPrivateKey(privatekey);
                cipherInstance.init(Cipher.DECRYPT_MODE, pKey);
                byte[] decrypted = cipherInstance.doFinal(decoded);
                System.out.println("Decrypted text is " + new String(decrypted));
            } catch (Exception e) {
                //Unable to encrypt the content. Default to send the otp to user
                //no error or exception thrown.
                e.printStackTrace();
            }
    }
    
}

Étape 1 : Créer une application CustomUI

Voir Ajouter des applications pour plus d'informations sur les applications personnalisées.

Étape 2 : Générer une paire de clés pour un certificat auto-signé

Pour recevoir le code secret à usage unique dans la réponse, le client consommateur doit générer une paire de clés privée/publique, puis générer un certificat auto-signé et importer ce certificat dans l'application CustomUI.
  • Assurez-vous que le fichier de configuration otp-client.conf contient les informations suivantes. Générez ensuite une paire de clés privée/publique.
    [ req ]
    encrypt_key = no
    default_bits = 2048
    default_md = sha256
    utf8 = yes
    string_mask = utf8only
    prompt = no
    distinguished_name = user_dn
    [ user_dn ]
    0.organizationName = "Oracle"
    organizationalUnitName = "OCI"
    commonName = "OtpClient"
    
  • Utilisez la commande suivante pour générer un certificat auto-signé.
    #generate self signed client certificate
    
    openssl genrsa -out OtpClient.key 2048
    openssl req -new -x509 -days 10000 -key OtpClient.key -out OtpClient.crt  -subj "/CN=Root CA/C=IN/ST=KarnatakaCalifornia/L=Bangalore/O=Oracle"  -config otp-client.conf
    openssl pkcs8 -topk8 -inform PEM -in OtpClient.key -out OtpClientX509Format.key -nocrypt
    

Étape 3 : Configurer l'application pour retourner le mot de passe à usage unique dans la réponse

Une fois le certificat auto-signé généré, vous devez l'importer dans l'application CustomUI.
  1. Dans la console Identity Cloud Service, développez le tiroir de navigation, sélectionnez Applications, application CustomUI, Configuration, puis Configuration du client.
  2. Importez le certificat auto-signé dans le certificat de client approuvé et enregistrez la configuration.

Étape 4 : Demander le code secret à usage unique

Données utiles de la demande
Attribut Valeurs/échantillons pris en charge Valeurs multiples Détails de l'utilisation
userFlowControlledByExternalClient true / false faux
Régler cette option à
true
et le mot de passe à usage unique sera retourné dans la réponse dans le format chiffré spécifié.

Note : Le certificat utilisé pour le chiffrement est chargé à l'avance dans l'application et référencé à l'aide de l'attribut x5t dans l'exemple de demande, comme indiqué ci-dessous.

x5t Chaîne / X509 SHA-1 Certificat Empreinte

Lorsqu'il est spécifié, le service utilise ce certificat chargé pour chiffrer les données du code secret à usage unique.

Note : L'attribut "x5t" doit correspondre au certificat chargé.

Exemple de demande
{
   "op": "credSubmit",
   "credentials": {
      "username": "test.user",
      "password": "example-password"
   },
   "userFlowControlledByExternalClient": true,
   "x5t": "<certificate thumbprint>",
   "requestState": "{{requestState}}"
}
Données utiles de la réponse
Attribut Valeurs/échantillons pris en charge Valeurs multiples Détails de l'utilisation
otp

Carte

"otp": {
        "value": "IMCw==",
        "alg": "RSAES-OAEP",
        "x5t": "<certificate thumbprint>"
 }
faux

Lorsqu'il est présent dans la réponse, l'attribut contient le mot de passe à usage unique chiffré avec les détails suivants.

  • valeur : Valeur chiffrée.
  • alg : Algorithme utilisé pour le chiffrement.
  • x5t : Empreinte SHA-1 X509 du certificat utilisé pour le chiffrement.

Exemple de réponse

{
    "otp": {
        "value": "IMsNO+rqNCw==",
        "alg": "RSAES-OAEP",
        "x5t": "<certificate thumbprint>"
    },
    "status": "success",
    "ecId": "Ft^OD161000000000",
    "displayName": "+91XXXXXXXX013",
    "nextAuthFactors": [
        "SMS"
    ],
    "SMS": {
        "credentials": [
            "otpCode"
        ]
    },
    "nextOp": [
        "credSubmit",
        "getBackupFactors",
        "resendCode"
    ],
    "scenario": "AUTHENTICATION",
    "requestState": "FrrACc",
    "trustedDeviceSettings": {
        "trustDurationInDays": 15
    }
}

Génération du jeton d'accès à l'aide de l'API d'authentification

Ce cas d'utilisation fournit un exemple étape par étape d'utilisation des domaines d'identité pour générer un jeton d'accès à l'aide de l'API d'authentification. L'utilisateur obtient des informations sur l'utilisateur via Me Access Token à l'aide de l'API d'authentification.

Note

  • Utilisez cette API d'authentification uniquement si vous créez votre propre expérience de connexion de bout en bout en développant une application de connexion personnalisée à utiliser par les domaines d'identité.
  • Cette API d'authentification ne peut pas être utilisée pour intégrer vos applications à des domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation pour l'authentification des domaines d'identité et le fichier de variables globales à partir du dossier idcs-authn-api-rest-clients dans le référentiel idm-samples GitHub, puis importez-les dans Postman.

Lorsque l'utilisateur tente d'accéder à une application associée à TOU, le serveur de domaines d'identité utilise le nom de l'application pour extraire la politique affectée à cette application. En fonction des paramètres du client, le serveur obtient le fournisseur d'identités et la politique d'authentification, puis guide l'utilisateur à l'étape suivante.

Étape 1 : Démarrer le flux d'authentification

Obtenez la valeur requestState initiale pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant présente la demande au format cURL :

   curl  -X GET
   -H "Content-Type: application/json" 
   -H "Authorization: Bearer {{access_token_value}}"
   https://<domainURL>/sso/v1/sdk/authenticate?appName={{app_name}}
Note

appName est facultatif. appName est le nom de l'application à laquelle le client veut accéder. Si une valeur appName est fournie, les politiques d'authentification propres à l'application sont traitées et le client est mis au défi pour les facteurs requis en fonction de cette politique.

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "ecId": "ecId",
 "nextOp": [
        "credSubmit"
    ],
    "nextAuthFactors": [
        "USERNAME_PASSWORD"
    ],
    "USERNAME_PASSWORD": {
        "credentials": [
            "username",
            "example-password"
        ]
    },
    "requestState": "{{requestState}}"
}

Dans la réponse, la valeur nextOp indique ce qui peut être envoyé en tant que valeur op dans la demande suivante. Dans cet exemple de cas d'utilisation, credSubmit doit être envoyé à l'étape suivante. requestState contient les données contextuelles nécessaires au traitement de la demande.

Étape 2 : Soumettre les données d'identification de l'utilisateur

Dans ce scénario, l'utilisateur publie les données d'identification de l'utilisateur et extrait authnToken. Les éléments suivants doivent être inclus dans la demande :
  • Nom d'utilisateur et mot de passe credentials:

  • requestState: reçu dans la réponse de l'étape 1

  • op: indique au serveur le type d'opération souhaité par le client

AuthnToken est le fichier id_token au format JWT qui représente les informations sur l'utilisateur courant, la session et les données de demande. Sert à créer un témoin de session d'authentification unique et à le rediriger vers l'URL cible. Si le nom d'utilisateur et le mot de passe sont valides, AuthnToken est extrait.

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON pour le point d'extrémité /sso/v1/sdk/authenticate :

{  
   "op":"credSubmit",
   "credentials":{  
      "username":"admin@oracle.com",
      "password":"example-password"
   },
   "requestState": "{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON où AuthnToken est extrait :

{
    "authnToken": "eyJ4NXQjUzI1NiI6Iks0R0hvZ...ZLjOZmKAvORB8OaV1Xqt1GL3tx1kyWA",
    "status": "success",
    "ecId": "5fR1O171000000000"
}

Étape 3 : Générer le jeton d'accès

Une fois que vous avez extrait AuthnToken, il est utilisé pour obtenir le jeton d'accès à partir du serveur OAuth.

Exemple de demande

L'exemple suivant montre le contenu de la demande au format JSON :

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&scope=urn:opc:idm:__myscopes__&assertion={{authnToken}}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "access_token": "<redacted>",
    "token_type": "Bearer",
    "expires_in": 7600
}

Étape 4 : Obtenir des informations sur l'utilisateur

L'utilisateur soumet le jeton d'accès pour obtenir ses informations telles que le nom d'utilisateur, le nom d'affichage, l'ID courriel, etc.

Exemple de demande

L'exemple suivant montre le contenu de la demande au format JSON.

{{HOST}}/admin/v1/Me

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON avec des informations sur l'utilisateur.

{
    "idcsCreatedBy": {
        "type": "App",
        "display": "idcssm",
        "value": "4ba14c4be74d48d497da6ce651209a06",
        "$ref": "https://docteam.identity.internal.oracle.com:8943/admin/v1/Apps/4ba14c4be74d48d497da6ce651209a06"
    },
    "id": "de94e8399a0e4f23ac52fc681f5fb828",
    "meta": {
        "created": "2022-12-12T09:46:53.646Z",
        "lastModified": "2022-12-13T10:35:32.604Z",
        "resourceType": "Me",
        "location": "https://docteam.identity.internal.oracle.com:8943/admin/v1/Me/de94e8399a0e4f23ac52fc681f5fb828"
    },
    "active": true,
    "displayName": "admin opc",
    "idcsLastModifiedBy": {
        "value": "6567bac90beb4e65a2eb3b280b2f0d1f",
        "display": "idcssso",
        "type": "App",
        "$ref": "https://docteam.identity.internal.oracle.com:8943/admin/v1/Apps/6567bac90beb4e65a2eb3b280b2f0d1f"
    },
    "nickName": "TAS_TENANT_ADMIN_USER",
    "userName": "admin@oracle.com",
    "urn:ietf:params:scim:schemas:oracle:idcs:extension:user:User": {
        "isFederatedUser": false
    },
    "emails": [
        {
            "verified": false,
            "primary": false,
            "secondary": false,
            "value": "admin@oracle.com",
            "type": "recovery"
        },
        {
            "verified": false,
            "primary": true,
            "secondary": false,
            "value": "admin@oracle.com",
            "type": "work"
        }
    ],
    "urn:ietf:params:scim:schemas:oracle:idcs:extension:userState:User": {
        "locked": {
            "on": false
        }
    },
    "name": {
        "formatted": "admin opc",
        "familyName": "opc",
        "givenName": "admin"
    },
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User",
        "urn:ietf:params:scim:schemas:oracle:idcs:extension:user:User",
        "urn:ietf:params:scim:schemas:oracle:idcs:extension:userState:User"
    ]
}

Authentification avec le nom d'utilisateur, le mot de passe et l'authentification multifacteur

Ce cas d'utilisation fournit un exemple étape par étape d'utilisation de l'API REST des domaines d'identité pour l'authentification avec les données d'identification d'un utilisateur et l'authentification multifacteur.

Note

  • Utilisez cette API d'authentification uniquement si vous créez votre propre expérience de connexion de bout en bout en développant une application de connexion personnalisée à utiliser par les domaines d'identité.
  • Cette API d'authentification ne peut pas être utilisée pour intégrer vos applications à des domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation pour l'authentification des domaines d'identité et le fichier de variables globales à partir du dossier idcs-authn-api-rest-clients dans le référentiel idm-samples GitHub, puis importez-les dans Postman.

Pour ce cas d'utilisation, procédez comme suit :

Note

Ces étapes supposent que l'authentification multifacteur est activée et qu'une politique d'authentification est créée pour l'authentification multifacteur. Voir Configuration des paramètres d'authentification multifacteur.

Étape 1 : Démarrer le flux d'authentification

Obtenez la valeur requestState initiale pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant présente la demande au format cURL :

   curl  -X GET
   -H "Content-Type: application/json" 
   -H "Authorization: Bearer {{access_token_value}}"
   https://<domainURL>/sso/v1/sdk/authenticate?appName={{app_name}}
Note

appName est facultatif. appName est le nom de l'application à laquelle le client veut accéder. Si une valeur appName est fournie, les politiques d'authentification propres à l'application sont traitées et le client est mis au défi pour les facteurs requis en fonction de cette politique.

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "ecId": "ecId",
 "nextOp": [
        "credSubmit"
    ],
    "nextAuthFactors": [
        "USERNAME_PASSWORD"
    ],
    "USERNAME_PASSWORD": {
        "credentials": [
            "username",
            "example-password"
        ]
    },
    "requestState": "{{requestState}}"
}

Dans la réponse, la valeur nextOp indique ce qui peut être envoyé en tant que valeur op dans la demande suivante. Dans cet exemple de cas d'utilisation, credSubmit doit être envoyé à l'étape suivante. requestState contient les données contextuelles nécessaires au traitement de la demande.

Étape 2 : Soumettre les données d'identification de l'utilisateur

Soumettez les données d'identification de l'utilisateur comme premier facteur, à savoir le nom d'utilisateur et le mot de passe. Pour cette étape, le client doit inclure les attributs suivants :

  • Nom d'utilisateur et mot de passe credentials:

  • requestState: reçu dans la réponse de l'étape 1

  • op: indique au serveur le type d'opération souhaité par le client

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON :

{
   "op": "credSubmit",
   "credentials": {
      "username": "{{username}}",
      "password": "{{password}}"
   },
   "requestState": "{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON, car les avis PUSH sont le facteur privilégié :

{
    "status": "pending",
    "displayName": "Joe's iPhone",
    "nextAuthFactors": [
        "PUSH"
    ],
    "cause": [
        {
            "code": "AUTH-1108",
            "message": "Push Notification approval is pending."
        }
    ],
    "nextOp": [
        "credSubmit",
        "getBackupFactors"
    ],
    "requestState": "rATagRibc//b.....xrKh7fJtIuWo",
    "trustedDeviceSettings": {
        "trustDurationInDays": 15
    }
}
Note

Si le paramètre Appareil approuvé est désactivé au niveau du locataire, l'attribut {{trustedDeviceSettings}} n'est pas retourné dans la réponse.

Si le paramètre Appareil approuvé est activé au niveau du locataire et si la règle de règle d'authentification mise en correspondance a la fréquence d'authentification multifacteur = À chaque fois, le champ {{trustedDeviceSettings}} est retourné, mais la valeur {{trustDurationInDays}} est retournée comme 0.
"trustedDeviceSettings": {
       "trustDurationInDays": 0
 }

Dans la réponse, le statut est pending, car l'utilisateur doit autoriser ou refuser l'avis PUSH sur son appareil. Les valeurs nextOp dans la réponse indiquent ce qui peut être envoyé en tant que valeur op dans la demande suivante. Dans cet exemple de cas d'utilisation, credSubmit est envoyé à l'étape suivante.

Étape 3 : Authentifier à l'aide du facteur privilégié

Authentifiez-vous à l'aide du facteur préféré, qui dans cet exemple de cas d'utilisation est PUSH Notifications. Le client doit inclure les attributs suivants dans cette demande :

  • op: indique au serveur le type d'opération souhaité par le client

  • requestState: reçu dans la réponse de l'étape 2

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON pour terminer l'authentification à l'aide de la méthode privilégiée :

{  
   "op":"credSubmit",
   "requestState":"{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "authnToken": "eyJraWQiOiJT.....kLbxxL97U_0Q",
    "status": "success"
}

Authentification avec nom d'utilisateur et mot de passe et inscription à l'authentification multifacteur

Ce cas d'utilisation fournit un exemple étape par étape d'utilisation de l'API d'authentification des domaines d'identité pour l'authentification avec les données d'identification d'un utilisateur, puis pour l'inscription à l'authentification multifacteur.

Note

  • Utilisez cette API d'authentification uniquement si vous créez votre propre expérience de connexion de bout en bout en développant une application de connexion personnalisée à utiliser par les domaines d'identité.
  • Cette API d'authentification ne peut pas être utilisée pour intégrer vos applications à des domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation pour l'authentification des domaines d'identité et le fichier de variables globales à partir du dossier idcs-authn-api-rest-clients dans le référentiel idm-samples GitHub, puis importez-les dans Postman.
Pour le cas d'utilisation, procédez comme suit. Chaque étape contient des exemples de demande et de réponse :
Note

Ces étapes supposent que l'authentification multifacteur est activée et qu'une politique d'authentification est créée pour l'authentification multifacteur. Voir Configuration des paramètres d'authentification multifacteur.

Étape 1 : Démarrer le flux d'authentification

Obtenez la valeur requestState initiale pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant présente la demande au format cURL :

   curl  -X GET
   -H "Content-Type: application/json" 
   -H "Authorization: Bearer {{access_token_value}}"
   https://<domainURL>/sso/v1/sdk/authenticate?appName={{app_name}}
Note

appName est facultatif. appName est le nom de l'application à laquelle le client veut accéder. Si une valeur appName est fournie, les politiques d'authentification propres à l'application sont traitées et le client est mis au défi pour les facteurs requis en fonction de cette politique.

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "ecId": "ecId",
 "nextOp": [
        "credSubmit"
    ],
    "nextAuthFactors": [
        "USERNAME_PASSWORD"
    ],
    "USERNAME_PASSWORD": {
        "credentials": [
            "username",
            "example-password"
        ]
    },
    "requestState": "{{requestState}}"
}

Dans la réponse, la valeur nextOp indique ce qui peut être envoyé en tant que valeur op dans la demande suivante. Dans cet exemple de cas d'utilisation, credSubmit doit être envoyé à l'étape suivante. requestState contient les données contextuelles nécessaires au traitement de la demande.

Étape 2 : Soumettre les données d'identification de l'utilisateur

Soumettez les données d'identification de l'utilisateur comme premier facteur, à savoir le nom d'utilisateur et le mot de passe. Pour cette étape, le client doit inclure les attributs suivants :

  • Nom d'utilisateur et mot de passe credentials:

  • requestState: reçu dans la réponse de l'étape 1

  • op: indique au serveur le type d'opération souhaité par le client

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON :

{
   "op": "credSubmit",
   "credentials": {
      "username": "{{username}}",
      "password": "{{password}}"
   },
   "requestState": "{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "nextAuthFactors": [
        "TOTP",
        "SMS",
        "EMAIL",
        "SECURITY_QUESTIONS"
    ],
    "TOTP": {
        "credentials": [
            "offlineTotp"
        ]
    },
    "SMS": {
        "credentials": [
            "phoneNumber"
        ]
    },
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "mfaSettings": {
        "enrollmentRequired": false
    },
    "requestState": "m3oIaGVOlHwA...../Fi+1RpmKmd4"
}

Dans cet exemple de cas d'utilisation, comme l'authentification multifacteur est définie comme facultative dans la politique d'authentification (indiquée par la valeur false pour l'attribut enrollmentRequired), l'utilisateur peut s'inscrire ou ignorer l'inscription. Si l'authentification multifacteur est requise, la seule valeur nextOp est enrollment.

Dans cet exemple de cas d'utilisation, enrollment est envoyé à l'étape suivante pour lancer l'inscription au facteur d'authentification multifacteur pour l'utilisateur. Notez que BYPASSCODE est manquant en tant que valeur nextAuthFactors car l'utilisateur ne peut pas s'inscrire à l'aide d'un code de contournement. Le code de contournement doit être généré par l'utilisateur à l'aide de Mon profil ou en demandant à un administrateur d'en générer un pour lui.

Étape 3 : Lancer l'inscription à l'authentification au deuxième facteur

Cette étape lance l'inscription au code secret à usage unique basé sur le temps en ligne (TOTP). Le client doit inclure les attributs suivants :
  • op: indique au serveur le type d'opération souhaité par le client

  • authFactor: définit le facteur d'authentification auquel l'utilisateur veut s'inscrire

  • requestState: reçu dans la réponse de l'étape 2

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON :

{  
   "op":"enrollment",
   "authFactor":"TOTP",
   "requestState":"{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "displayName": "Joe's Phone",
    "TOTP": {
        "credentials": [
            "otpCode"
        ],
        "qrCode": {
            "content": "oraclemobileauthenticator://totp/user?issuer=example1&Period=30&algorithm=SHA1&digits=6&RSA=SHA256withRSA&Deviceid=22f38324e67f4e2bb8e9e24583924a31&RequestId=9b428c1a-abb3-40ee-bd24-5064a87b638e&LoginURL=https%3A%2F%2Fexampletenant.com%3A8943%2Fsso%2Fv1%2F&OTP=eyJraWQiOiJTSUdOSU5HX0tFWSIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJkZXZpY2VfaWQiOiIyMmYzODMyNGU2N2Y0ZTJiYjhlOWUyNDU4MzkyNGEzMSIsImlzcyI6IkF1dGhTcnYiLCJleHAiOjE1MjcxODEwODEsImlhdCI6MTUyNzE4MDc4MSwidGVuYW50IjoidGVuYW50MSJ9.Of0Hv5H3aRpDqdsiFLO0YkK2gbzq78k3jaJFwoWwR5LKOEH-9qTt1zjSiXujPD1T__8fEZDi8iKDyxXtL5zjAlEKd5wI026JjekG58ROPjW8gADWcMrTGQ4Lgw4Q0UPjk8Fm8AloQ1vS6xpDre6S-Vv620z28EKWZK_yGhUVSfAJVzSUxaypLtQhOQJBCNAzCElUgqyav7Vpi2z5eVQBQRtXv-Z_sTgrFXaVmVU3uSNVcg6zVX2x0fMQFgeO5lyC3U2Yy9JgA7iMfAMpuNvBzW0GjyByPAYRVnHSLPuHL1qiNx9ygpoVEcFLQJcOPuDLW2bW9ZwbUcVdS0F4L_2NfA&ServiceType=TOTP&KeyPairLength=2048&SSE=Base32",
            "imageType": "image/png",
            "imageData": "iVBORw0KG.......5ErkJggg=="
        }
    },
    "nextOp": [
        "credSubmit",
        "createToken",
        "createSession",
        "enrollment"
    ],
    "mfaSettings": {
        "enrollmentRequired": false
    },
    "requestState": "8A317/A1JiQe.....ce5/paoVOWw"
}
Dans la réponse, les valeurs nextOp indiquent ce qui peut être envoyé en tant que valeur op dans la demande suivante. Dans cet exemple de cas d'utilisation, credSubmit est envoyé à l'étape suivante.
Note

La valeur de content commence toujours par oraclemobileauthenticator//.

Étape 4 : Soumettre les données d'identification du facteur

Cette étape soumet les données d'identification de facteur dans requestState qui ont été reçues dans la réponse de l'étape 3. Notez que les données utiles de la demande ne contiennent pas l'attribut authFactor, car requestState les contient. Le client doit inclure les attributs suivants :
  • op: indique au serveur le type d'opération souhaité par le client

  • requestState: reçu dans la réponse de l'étape 3

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON pour soumettre les données d'identification du facteur :

{  
   "op":"credSubmit",
   "requestState":"{{requestState}}"
}

Exemple de réponse

Le statut success apparaît dans la réponse lorsque la communication entre l'application OMA et le canal dorsal du serveur est terminée et que la vérification optCode a réussi. L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "displayName": "Joe's iPhone",
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "requestState": "eyZa+10USFR7.....6I2vnfK82hnQ"
}

Dans la réponse, les valeurs nextOp indiquent ce qui peut être envoyé en tant que valeur op dans la demande suivante. Dans cet exemple de cas d'utilisation, createToken est envoyé à l'étape suivante.

Exemple de réponse en attente

Le statut pending s'affiche lorsque la communication entre l'application OMA et le canal dorsal du serveur n'est pas terminée. Le client continue de scruter toutes les 10 secondes et continue de scruter pendant deux minutes. Après deux minutes, le serveur envoie le statut d'échec si la vérification otpCode échoue.

{
    "status": "pending",
    "cause": [
        {
            "code": "AUTH-1109",
            "message": "Enrollment in the One-Time Passcode authentication method is pending verification."
        }
    ],
    "nextOp": [
        "credSubmit",
        "createToken",
        "createSession",
        "enrollment"
    ],
    "mfaSettings": {
        "enrollmentRequired": false
    },
    "requestState": "1bYZJeyi6bcp..........74RXYKmbdiZfVW8y7tNc"
}

Étape 5 : Créer le jeton d'authentification

Cette étape indique que le client est terminé avec tous les éléments authnFactors et qu'une session doit être créée. Le serveur vérifie qu'aucune autre évaluation de facteur (selon ce qui est défini pour la stratégie) n'est nécessaire et répond avec le jeton ou refuse l'accès. Le client doit inclure les attributs suivants :

  • op: indique au serveur le type d'opération souhaité par le client

  • requestState: reçu dans la réponse de l'étape 4

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON :
{  
   "op":"createToken",
   "requestState":"{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "authnToken": "{{authnToken}}",
    "status": "success"
}

Authentification du nom d'utilisateur et du mot de passe et inscription à la récupération de compte

Ce cas d'utilisation fournit un exemple étape par étape d'utilisation de l'API d'authentification des domaines d'identité pour l'authentification avec les données d'identification d'un utilisateur, puis pour l'inscription à la récupération de compte.

Note

  • Utilisez cette API d'authentification uniquement si vous créez votre propre expérience de connexion de bout en bout en développant une application de connexion personnalisée à utiliser par les domaines d'identité.
  • Cette API d'authentification ne peut pas être utilisée pour intégrer vos applications à des domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation pour l'authentification des domaines d'identité et le fichier de variables globales à partir du dossier idcs-authn-api-rest-clients dans le référentiel idm-samples GitHub, puis importez-les dans Postman.
Note

Ces étapes supposent que plusieurs facteurs sont activés pour la récupération de compte, mais l'inscription à l'authentification multifacteur n'est pas configurée. Voir Configurer la récupération de compte et Configurer les paramètres d'authentification multifacteur.

Étape 1 : Démarrer le flux d'authentification

Obtenez la valeur requestState initiale pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant présente la demande au format cURL :

   curl  -X GET
   -H "Content-Type: application/json" 
   -H "Authorization: Bearer {{access_token_value}}"
   https://<domainURL>/sso/v1/sdk/authenticate?appName={{app_name}}
Note

appName est facultatif. appName est le nom de l'application à laquelle le client veut accéder. Si une valeur appName est fournie, les politiques d'authentification propres à l'application sont traitées et le client est mis au défi pour les facteurs requis en fonction de cette politique.

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "ecId": "ecId",
 "nextOp": [
        "credSubmit"
    ],
    "nextAuthFactors": [
        "USERNAME_PASSWORD"
    ],
    "USERNAME_PASSWORD": {
        "credentials": [
            "username",
            "example-password"
        ]
    },
    "requestState": "{{requestState}}"
}

Dans la réponse, la valeur nextOp indique ce qui peut être envoyé en tant que valeur op dans la demande suivante. Dans cet exemple de cas d'utilisation, credSubmit doit être envoyé à l'étape suivante. requestState contient les données contextuelles nécessaires au traitement de la demande.

Étape 2 : Soumettre les données d'identification de l'utilisateur

Soumettez les données d'identification de l'utilisateur comme premier facteur, à savoir le nom d'utilisateur et le mot de passe. Pour cette étape, le client doit inclure les attributs suivants :

  • Nom d'utilisateur et mot de passe credentials:

  • requestState: reçu dans la réponse de l'étape 1

  • op: indique au serveur le type d'opération souhaité par le client

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON :

{
   "op": "credSubmit",
   "credentials": {
      "username": "{{username}}",
      "password": "{{password}}"
   },
   "requestState": "{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "ecId": "R^iCq18G000000000",
    "accRecEnrollmentRequired": true,
    "nextAuthFactors": [
        "SMS",
        "SECURITY_QUESTIONS",
        "EMAIL"
    ],
    "SMS": {
        "credentials": [
            "phoneNumber",
            "countryCode"
        ]
    },
    "EMAIL": {
        "userAllowedToSetRecoveryEmail": "true",
        "primaryEmailVerified": "true",
        "primaryEmail": "clarence.saladna@example.com",
        "credentials": [
            "recoveryEmail"
        ]
    },
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "requestState": "IjhvZPILfadhlnih+4uTJ83CHf....0SDELTO0mTRqC+nNU"
}

Dans cet exemple de cas d'utilisation, l'utilisateur doit s'inscrire à la récupération de compte (indiquée par la valeur true pour l'attribut accRecEnrollmentRequired:true). nextAuthFactors indique les facteurs auxquels l'utilisateur peut s'inscrire pour la récupération de compte.

Dans cet exemple de cas d'utilisation, l'inscription est envoyée à l'étape suivante pour lancer l'inscription au recouvrement de compte pour l'utilisateur.

Étape 3 : Lancer l'inscription au recouvrement de compte

Cette étape lance l'inscription par SMS. Le client doit inclure les attributs suivants :

  • op : Indique au serveur le type d'opération souhaité par le client
  • authFactor : Définit le facteur d'authentification auquel l'utilisateur veut s'inscrire
  • phoneNumber : Définit le numéro de téléphone où le texte du SMS sera envoyé.
  • countryCode : Définit le code de pays du numéro de téléphone où le texte du SMS sera envoyé.
  • requestState : Réception dans la réponse de l'étape 2

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON :

{  
   "op":"enrollment",
   "authFactor":"SMS",
   "credentials":{  
      "phoneNumber":"1122334455",
      "countryCode":"+44"
   },
   "requestState":"{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la demande au format JSON :

{
    "status": "success",
    "ecId": "R^iCq19G000000000",
    "displayName": "+44XXXXXXXX455",
    "SMS": {
        "credentials": [
            "otpCode"
        ]
    },
    "nextOp": [
        "credSubmit",
        "resendCode",
        "enrollment"
    ],
    "requestState": "Y4sMHf7izgxcspF6zr...Y3GXLjjudeRMM2ZNty4E"
}

Dans la réponse, les valeurs nextOp indiquent ce qui peut être envoyé en tant que valeur d'opération dans la demande suivante. Dans cet exemple de cas d'utilisation, credSubmit est envoyé à l'étape suivante. otpCode est envoyé par SMS à l'appareil de l'utilisateur.

Étape 4 : Soumettre les données d'identification du facteur

Cette étape soumet les données d'identification de facteur dans requestState qui ont été reçues dans la réponse de l'étape 3. Notez que les données utiles de la demande ne contiennent pas l'attribut authFactor, car requestState les contient. Le client doit inclure les attributs suivants :
  • op : Indique au serveur le type d'opération souhaité par le client
  • requestState : Réception dans la réponse de l'étape 3

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON pour soumettre les données d'identification du facteur :

{  
   "op":"credSubmit",
   "credentials":{  
      "otpCode":"974311"
   },
   "requestState":"{{requestState}}"
}

Exemple de réponse

Le statut de réussite apparaît dans la réponse lorsque la vérification optCode est réussie. L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "ecId": "R^iCq1BG000000000",
    "accRecEnrollmentRequired": false,
    "displayName": "+44XXXXXXXX455",
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "requestState": "BKbGp43pwZad3zMSePWu7R47Va6myZdNY...vRVFN2FFQKIoDto"
}

Dans la réponse, la valeur accRecEnrollmentRequired est réglée à false, car l'inscription au compte a réussi. Les valeurs nextOp indiquent ce qui peut être envoyé en tant que valeur op dans la demande suivante. La valeur nextOp "adhésion" permet à l'utilisateur de passer à un autre facteur pour s'inscrire à la récupération de compte. Dans cet exemple de cas d'utilisation, createToken est envoyé à l'étape suivante.

Étape 5 : Créer le jeton d'authentification

Cette étape indique que le client est terminé et qu'une session doit être créée. Le serveur vérifie qu'aucune autre évaluation de facteur (selon ce qui est défini pour la stratégie) n'est nécessaire et répond avec le jeton ou refuse l'accès. Le client doit inclure les attributs suivants :
  • op : Indique au serveur le type d'opération souhaité par le client : requestState reçu dans la réponse de l'étape 4
  • requestState : Réception dans la réponse de l'étape 4

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON :

{  
   "op":"createToken",
   "requestState":"{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "authnToken": "{{authnToken}}",
    "status": "success",
    "ecId": "R^iCq1FG000000000"
}

Authentification du nom d'utilisateur et du mot de passe et inscription à la récupération de compte et à l'authentification multifacteur

Ce cas d'utilisation fournit un exemple étape par étape d'utilisation de l'API d'authentification des domaines d'identité pour l'authentification avec les données d'identification d'un utilisateur, puis pour l'inscription à la récupération de compte et à l'authentification multifacteur.

Note

  • Utilisez cette API d'authentification uniquement si vous créez votre propre expérience de connexion de bout en bout en développant une application de connexion personnalisée à utiliser par les domaines d'identité.
  • Cette API d'authentification ne peut pas être utilisée pour intégrer vos applications à des domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation pour l'authentification des domaines d'identité et le fichier de variables globales à partir du dossier idcs-authn-api-rest-clients dans le référentiel idm-samples GitHub, puis importez-les dans Postman.
Note

Ces étapes supposent que la récupération de compte et l'authentification multifacteur sont activées et qu'une politique d'authentification est créée pour l'authentification multifacteur. Voir Configurer la récupération de compte et Configurer les paramètres d'authentification multifacteur.

Étape 1 : Démarrer le flux d'authentification

Obtenez la valeur requestState initiale pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant présente la demande au format cURL :

   curl  -X GET
   -H "Content-Type: application/json" 
   -H "Authorization: Bearer {{access_token_value}}"
   https://<domainURL>/sso/v1/sdk/authenticate?appName={{app_name}}
Note

appName est facultatif. appName est le nom de l'application à laquelle le client veut accéder. Si une valeur appName est fournie, les politiques d'authentification propres à l'application sont traitées et le client est mis au défi pour les facteurs requis en fonction de cette politique.

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "ecId": "ecId",
 "nextOp": [
        "credSubmit"
    ],
    "nextAuthFactors": [
        "USERNAME_PASSWORD"
    ],
    "USERNAME_PASSWORD": {
        "credentials": [
            "username",
            "example-password"
        ]
    },
    "requestState": "{{requestState}}"
}

Dans la réponse, la valeur nextOp indique ce qui peut être envoyé en tant que valeur op dans la demande suivante. Dans cet exemple de cas d'utilisation, credSubmit doit être envoyé à l'étape suivante. requestState contient les données contextuelles nécessaires au traitement de la demande.

Étape 2 : Soumettre les données d'identification de l'utilisateur

Soumettez les données d'identification de l'utilisateur comme premier facteur, à savoir le nom d'utilisateur et le mot de passe. Pour cette étape, le client doit inclure les attributs suivants :

  • Nom d'utilisateur et mot de passe credentials:

  • requestState: reçu dans la réponse de l'étape 1

  • op: indique au serveur le type d'opération souhaité par le client

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON :

{
   "op": "credSubmit",
   "credentials": {
      "username": "{{username}}",
      "password": "{{password}}"
   },
   "requestState": "{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "ecId": "HI^kd1M0000000000",
    "accRecEnrollmentRequired": true,
    "nextAuthFactors": [
        "SMS",
        "SECURITY_QUESTIONS",
        "EMAIL"
    ],
    "SMS": {
        "credentials": [
            "phoneNumber",
            "countryCode"
        ]
    },
    "EMAIL": {
        "userAllowedToSetRecoveryEmail": "true",
        "primaryEmailVerified": "true",
        "primaryEmail": "clarence.saladna@example.com",
        "credentials": [
            "recoveryEmail"
        ]
    },
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "requestState": "wtyRQpBzFZnuGMQvLNRotKfRIlgliWNc8sxipU....41zjKQcvdzk2bmvWs"
}

Dans cet exemple de cas d'utilisation, l'utilisateur doit s'inscrire à la récupération de compte (indiquée par la valeur true pour l'attribut accRecEnrollmentRequired:true). nextAuthFactors indique les facteurs auxquels l'utilisateur peut s'inscrire pour la récupération de compte.

Dans cet exemple de cas d'utilisation, l'inscription est envoyée à l'étape suivante pour lancer l'inscription au recouvrement de compte pour l'utilisateur.

Étape 3 : Lancer l'inscription au recouvrement de compte

Cette étape lance l'inscription par SMS. Le client doit inclure les attributs suivants :

  • op : Indique au serveur le type d'opération souhaité par le client
  • authFactor : Définit le facteur d'authentification auquel l'utilisateur veut s'inscrire
  • phoneNumber : Définit le numéro de téléphone où le texte du SMS sera envoyé.
  • countryCode : Définit le code de pays du numéro de téléphone où le texte du SMS sera envoyé.
  • requestState : Réception dans la réponse de l'étape 2

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON :

{  
   "op":"enrollment",
   "authFactor":"SMS",
   "credentials":{  
      "phoneNumber":"1122334455",
      "countryCode":"+44"
   },
   "requestState":"{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la demande au format JSON :

{
    "status": "success",
    "ecId": "HI^kd1N0000000000",
    "displayName": "+44XXXXXXXX213",
    "SMS": {
        "credentials": [
            "otpCode"
        ]
    },
    "nextOp": [
        "credSubmit",
        "resendCode",
        "enrollment"
    ],
    "requestState": "FnwYT23S0qo+RHXN3Sx80D3....8CsoT3QezVbynT3LfZY3+sXN5E8OtEdM"
}

Dans la réponse, les valeurs nextOp indiquent ce qui peut être envoyé en tant que valeur d'opération dans la demande suivante. Dans cet exemple de cas d'utilisation, credSubmit est envoyé à l'étape suivante. otpCode est envoyé par SMS à l'appareil de l'utilisateur. Les données d'identification indiquent à l'utilisateur quelle entrée est nécessaire pour transmettre la demande suivante.

Étape 4 : Soumettre les données d'identification du facteur

Cette étape soumet les données d'identification du facteur avec requestState qui ont été reçues dans la réponse de l'étape 3. Notez que les données utiles de la demande ne contiennent pas l'attribut authFactor, car requestState les contient. Le client doit inclure les attributs suivants :
  • op : Indique au serveur le type d'opération souhaité par le client
  • requestState : Réception dans la réponse de l'étape 3

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON pour soumettre les données d'identification du facteur :

{  
   "op":"credSubmit",
   "credentials":{  
      "otpCode":"974311"
   },
   "requestState":"{{requestState}}"
}

Exemple de réponse

Le statut de réussite apparaît dans la réponse lorsque la vérification optCode est réussie. L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "ecId": "HI^kd1P0000000000",
    "accRecEnrollmentRequired": false,
    "displayName": "+44XXXXXXXX455",
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "requestState": "Z+ysro8gFyPPT5bI9C/RykLfRrq5rBXCOO68/wZcgkllw765qd7SNvhRN6ZHp0Xiw2FIN9nOeio7SpsEAlYxO2xQ/1fF5lAjo0jwJEzIgSRt8xj/vAQeSLhX+PRm2a1rRYHwSa9uFcUBkNA.....KP7CPh2/yrdZF4WpbI"
}

Dans la réponse, la valeur accRecEnrollmentRequired est réglée à false, car l'inscription au compte a réussi. Les valeurs nextOp indiquent ce qui peut être envoyé en tant que valeur op dans la demande suivante. La valeur nextOp "adhésion" permet à l'utilisateur de passer à un autre facteur pour s'inscrire à la récupération de compte. Dans cet exemple de cas d'utilisation, createToken est envoyé à l'étape suivante.

Étape 5 : Créer le jeton d'authentification

Cette étape indique que le client a terminé l'inscription à la récupération de compte et qu'une session doit être créée. Le serveur vérifie qu'aucune autre évaluation de facteur (selon ce qui est défini pour la stratégie) n'est nécessaire et répond avec le jeton ou répond en conséquence. Le client doit inclure les attributs suivants :
  • op : Indique au serveur le type d'opération que le client souhaite recevoir requestState dans la réponse de l'étape 4
  • requestState : Réception dans la réponse de l'étape 4

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON :

{  
   "op":"createToken",
   "requestState":"{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :

{
    "status": "success",
    "ecId": "HI^kd1Q0000000000",
    "nextAuthFactors": [
        "TOTP",
        "SECURITY_QUESTIONS",
        "SMS",
        "EMAIL",
        "PUSH"
    ],
    "EnrolledAccountRecoveryFactorsDetails": {
        "SMS": {
            "credentials": [
                "accountRecoveryFactor"
            ],
            "enrolledDevices": [
                {
                    "deviceId": "3ed9b2ed366441fb91c9277abd694348",
                    "displayName": "+44XXXXXXXX455"
                }
            ]
        },
        "EMAIL": {
            "credentials": [
                "accountRecoveryFactor"
            ],
            "enrolledDevices": [
                {
                    "displayName": "clarence.saladna@example.com"
                }
            ]
        },
        "enrolledAccRecFactorsList": [
            "SMS",
            "EMAIL"
        ]
    },
    "nextOp": [
        "enrollment"
    ],
    "mfaSettings": {
        "enrollmentRequired": true
    },
    "requestState": "YN9sdSJiNtD5lOEKt33paDa9Ezs5ZZhZhF3C1BsDCuMdVVNqt1RmA3d3SppmnVOIP3uYrErQNYADHCIQLrXgmxpxReUzdcFDArlejaaph3qWctYvLQiIsBwixsHgTOfQiDkzyjN8JZiX/gqbkTEmHi1S3EtjYXuw7qCcwi...G8ZnyfTrcZtKEpaDDj7CtWF/+LIwAEQLvFaXvkOK4P4"
}

Dans la réponse, comme l'authentification multifacteur est requise, enrollmentRequired a la valeur true sous mfaSettings. Par conséquent, aucun jeton n'est émis. EnrolledAccountRecoveryFactorsDetails affiche les facteurs de récupération de compte auxquels l'utilisateur s'est inscrit. Les valeurs nextOp indiquent ce qui peut être envoyé en tant que valeur op dans la demande suivante. Dans cet exemple, la valeur nextOp "enrollment" indique que l'utilisateur doit s'inscrire à l'authentification multifacteur.

Étape 6 : Définir SMS comme facteur d'authentification multifacteur par défaut dans le chevauchement

Cette étape indique que le client doit s'inscrire à l'authentification multifacteur.

Le client doit inclure les attributs suivants :

  • authFactor : Indique le facteur auquel s'inscrire pour l'authentification multifacteur
  • accountRecoveryFactor : Lorsque cette option est réglée à Vrai, indique que l'utilisateur souhaite réutiliser le facteur de récupération de compte déjà inscrit pour l'authentification multifacteur.

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON :

{ 
 "op":"enrollment",
 "authFactor": "SMS",
 "credentials":{ 
  "accountRecoveryFactor" : true 
 },
 "requestState": "{{requestState}}"
}

Exemple de réponse


{
    "status": "success",
    "ecId": "HI^kd1R0000000000",
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "requestState": "7J6m/Z1PxXQZp4pigzt1F0CXp0kotX.....WXP2knQa16MNj5E8"
}

Dans la réponse, les valeurs nextOp indiquent ce qui peut être envoyé en tant que valeur d'opération dans la demande suivante. La valeur nextOp "adhésion" permet à l'utilisateur d'inscrire un facteur supplémentaire pour l'authentification multifacteur. Dans cet exemple de cas d'utilisation, createToken est envoyé à l'étape suivante.

Étape 7 : Créer le jeton d'authentification

Cette étape indique que le client a terminé avec tous les éléments authnFactors et a besoin d'une session créée. Selon ce qui est défini pour la stratégie, le serveur valide qu'aucune autre évaluation de facteur n'est nécessaire et répond avec le jeton ou refuse l'accès. Le client doit inclure les attributs suivants :
  • op : Indique au serveur le type d'opération souhaité par le client
  • requestState : Réception dans la réponse de l'étape 6

Exemple de demande

L'exemple suivant montre le contenu de la demande POST au format JSON :

{  
   "op":"createToken",
   "requestState":"{{requestState}}"
}

Exemple de réponse

L'exemple suivant montre le contenu de la réponse au format JSON :
{
    "authnToken": "{{authnToken}}",
    "status": "success",
    "ecId": "HI^kd1W0000000000"
}

Authentification par nom d'utilisateur et mot de passe et connexion

Activez et configurez l'option Me garder connecté (KMSI) afin que les utilisateurs puissent accéder à un domaine d'identité sans avoir à se connecter plusieurs fois.

Suivez les étapes ci-dessous pour configurer KMSI à l'aide d'interfaces d'application programmatiques.

Cette rubrique contient également les sections suivantes :

Avant de commencer

Étape 1 : Activer KMSI pour un domaine d'identité

Après l'activation de KMSI pour votre compte en nuage, effectuez les étapes suivantes pour activer KMSI pour un domaine d'identité IAM.
Note

Si vous voulez que le supérieur utilise l'interface utilisateur pour activer l'ICM, voir Modification des paramètres de session et Création d'une politique d'authentification.
  1. Obtenez le jeton d'accès de l'administrateur du domaine d'identité pour votre compte.
  2. Exécutez GET sur le point d'extrémité /admin/v1/KmsiSettings/KmsiSettings. Le système retourne KmsiSettings.
  3. Mettez à jour les attributs nécessaires et exécutez PUT sur le point d'extrémité /admin/v1/KmsiSettings/KmsiSettings.
tokenValidityInDays
Entrez le nombre de jours pendant lesquels les utilisateurs peuvent rester connectés avant leur déconnexion automatique.
kmsiEnabled
Indique si KMSI est activé pour le domaine d'identité.
maxAllowedSessions
Entrez le nombre maximal de sessions connectées qu'un utilisateur peut avoir.

Exemple de demande

{
    "schemas": [
        "urn:ietf:params:scim:schemas:oracle:idcs:KmsiSettings"
    ],
    "tokenValidityInDays": 2160,
    "kmsiEnabled": true,
    "maxAllowedSessions": 5,
    "id": "KmsiSettings"
}

Étape 2 : Démarrer le flux d'authentification

Obtenez la valeur requestState initiale pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant présente la demande au format cURL :

   curl  -X GET
   -H "Content-Type: application/json" 
   -H "Authorization: Bearer {{access_token_value}}"
   https://<domainURL>/sso/v1/sdk/authenticate?appName={{app_name}}
Note

appName est facultatif. appName est le nom de l'application à laquelle le client veut accéder. Si une valeur appName est fournie, les politiques d'authentification propres à l'application sont traitées et le client est mis au défi pour les facteurs requis en fonction de cette politique.

Exemple de réponse

{
    "status": "success",
    "ecId": "ZzK2c1^0000000000",
    "nextOp": [
        "credSubmit"
    ],
    "nextAuthFactors": [
        "USERNAME_PASSWORD"
    ],
    "USERNAME_PASSWORD": {
        "credentials": [
            "username",
            "password"
        ]
    },
    "keepMeSignedInEnabled": false,
    "requestState": "FT7qI"
}

Notez le nouvel attribut keepMeSignedInEnabled inclus dans la réponse. Indique que ce domaine d'identité et cette application prennent en charge KMSI. Si vous disposez d'une interface personnalisée, utilisez cet attribut pour afficher l'option Garder ma session active dans la page de connexion.

Étape 3 : Soumettre les données d'identification de l'utilisateur avec KMSI

Demande
  • Fonctionnement : POST
  • Point d'extrémité : /sso/v1/sdk/authenticate

Exemple de demande
Note

Notez le nouvel attribut keepMeSignedIn inclus dans la demande. Cet attribut indique que l'utilisateur veut utiliser KMSI.
{
    "op": "credSubmit",
    "credentials": {
        "username": "username",
        "password": "Password"
    },
    "keepMeSignedIn": true,
    "kmsiDeviceDisplayName": "Postman KeepMeSigned In",
    "requestState": "requestState"
}

Si vous disposez d'une interface personnalisée, utilisez cet attribut pour afficher l'option KMSI, cochez la case (activée ou désactivée) et envoyez ce paramètre pour créer la session KMSI.

Exemple de réponse

{
    "authnToken": "QpfQIQ",
    "kmsiToken": "ZJM",
    "status": "success",
    "ecId": "PR8Yf160000000000"
}

Dans l'exemple de réponse, notez l'attribut kmsiToken. Ce jeton peut être utilisé pour accéder à toutes les applications à l'avenir sans nécessiter qu'un utilisateur se reconnecte.

Étape 4 : Réémettre authnToken après l'expiration de la session

Demande
  • Fonctionnement : POST

  • Point d'extrémité : /sso/v1/sdk/authenticate

Exemple de demande

{
    "op": "credSubmit",
    "authFactor": "KMSI",
    "appName": "AppName",
    "kmsiToken": "{{kmsiToken}}"
}

Exemple de réponse

{
    "authnToken": "QpfQIQ",
    "kmsiToken": "ZJM",
    "status": "success",
    "ecId": "PR8Yf160000000000"
}

Notez l'opération credSubmit avec un nouveau authFactor, appName et kmsiToken en cours d'envoi dans la demande. L'authentification unique évalue la demande et retourne authnToken et la dernière mise à jour kmsiToken dans la réponse. Il s'agit d'un kmsiToken actualisé et remplace le jeton existant. Vous devez inclure cette kmsiToken actualisée dans la demande suivante.

Étape 5 : Soumettre les données d'identification de l'utilisateur avec le flux KMSI et MFA

Lancez GET sur /sso/v1/sdk/authenticate à partir de l'étape 2 : Démarrer le flux d'authentification.

Demande
  • Fonctionnement : POST

  • Point d'extrémité : /sso/v1/sdk/authenticate

Exemple de réponse

{
    "op": "credSubmit",
    "credentials": {
        "username": "username",
        "password": "Password"
    },
    "keepMeSignedIn": true,
    "kmsiDeviceDisplayName": "Postman KeepMeSigned In",
    "requestState": "requestState"
}

Exemple de réponse

{
    "status": "success",
    "ecId": "L371Y0xD000000000",
    "displayName": "sswXXXXX@oracle.com",
    "nextAuthFactors": [
        "EMAIL-OTP/TOTP/SMS-OTP/PUSH/BYPASSCODE"
    ],
    "EMAIL-OTP/TOTP/SMS-OTP/PUSH/BYPASSCODE": {
        "credentials": [
            "otpCode"
        ]
    },
    "nextOp": [
        "credSubmit",
        "getBackupFactors",
        "resendCode"
    ],
    "scenario": "AUTHENTICATION",
    "requestState": "QQwppp+-",
    "trustedDeviceSettings": {
        "trustDurationInDays": 15
    }
}

Après avoir obtenu le code secret à usage unique (OTP) sur l'appareil, ajoutez le code secret à usage unique dans la demande.

Exemple de demande

{
    "op": "credSubmit",
    "authFactor": "EMAIL-OTP/TOTP/SMS-OTP/PUSH/BYPASSCODE",
    "credentials": {
        "otpCode": "XXXX"
    },
    "requestState": "6tnX6Q4RGqe4Lq73WD0pQ"
}

La réponse comprend authToken et kmsiToken. Il s'agit d'un kmsiToken actualisé.

Exemple de réponse

{
    "authnToken": "QpfQIQ",
    "kmsiToken": "ZJM",
    "status": "success",
    "ecId": "PR8Yf160000000000"
}

Étape 6 : Réémettre authnToken après l'expiration de la session lorsqu'un facteur d'authentification multifacteur est défini

Lorsqu'un utilisateur tente de se connecter à l'aide de kmsiToken et qu'un deuxième facteur est configuré, il est toujours invité à authentifier le deuxième facteur. Ce n'est qu'après une authentification réussie que authnToken et kmsiToken seront envoyés dans la réponse.

Demande
  • Fonctionnement : POST

  • Point d'extrémité : /sso/v1/sdk/authenticate

Exemple de demande

{
    "op": "credSubmit",
    "authFactor": "KMSI",
    "appName": "AppName",
    "kmsiToken": "{{kmsiToken}}"
}

La réponse contient un jeton KMSI actualisé et une identification à l'authentification multifacteur.

Exemple de réponse

{
    "status": "success",
    "ecId": "pccFR1eG000000000",
    "displayName": "XXXXX@oracle.com",
    "nextAuthFactors": [
        "EMAIL-OTP/TOTP/SMS-OTP/PUSH/BYPASSCODE"
    ],
    "EMAIL-OTP/TOTP/SMS-OTP/PUSH/BYPASSCODE": {
        "credentials": [
            "otpCode"
        ]
    },
    "nextOp": [
        "credSubmit",
        "getBackupFactors",
        "resendCode"
    ],
    "scenario": "AUTHENTICATION",
    "requestState": "+Dj6hQQ7id5V2gSGHGtCROb5n",
    "trustedDeviceSettings": {
        "trustDurationInDays": 15
    },
    "kmsiToken": "fxkLne3RtKI1c"
}

Répétez le même processus où vous serez à nouveau invité à entrer le mot de passe à usage unique sur l'appareil. Fournissez les données utiles ci-dessous avec le code secret à usage unique. La réponse doit inclure authnToken.

Exemple de demande

{
    "op": "credSubmit",
    "authFactor": "EMAIL-OTP/TOTP/SMS-OTP/PUSH/BYPASSCODE",
    "credentials": {
        "otpCode": "XXXX"
    },
    "requestState": "6tnX6Q4RGqe4Lq73WD0pQ"
}

Exemple de réponse

{
    "authnToken": "QpfQIQ",
    "status": "success",
    "ecId": "PR8Yf160000000000"
}

Flux kmsiToken avec requestState

Utilisez ce flux pour prendre en charge le contexte du navigateur lorsque vous possédez le jeton KMSI, mais pas le témoin KMSI. Après l'expiration de la session, l'application effectue un appel d'autorisation au système d'identité avec redirectUrl, state, nonce, etc. Dans la réponse, le système d'identité retourne requestState dans loginCtx. Cette requestState ainsi que le jeton KMSI sont transmis pour rediriger l'application requise après avoir prolongé la session.

Demande
  • Fonctionnement : POST

  • Point d'extrémité : /sso/v1/sdk/authenticate

L'API prend en charge KMSI en tant que authFactor et authentifie KMSI avec le paramètre requestState. Cela permet d'extraire kmsiToken avec requestState à partir de loginCtx.
Note

Si requestState et kmsiToken ne proviennent pas de la même application, la demande est refusée.

Exemple de demande

{
    "op": "credSubmit",
    "authFactor": "KMSI",
    "appName": "KMSIAdmin",
    "kmsiToken": "{{kmsiToken}}",
    "requestState": "{{requestState}}"
}

Exemple de réponse

{
    "authnToken": "QpfQIQ",
    "kmsiToken": "ZJM",
    "status": "success",
    "ecId": "PR8Yf160000000000"
}

Modifications apportées à /sso/v1/sdk/secure/session

KMSI nécessite l'ajout d'un nouvel attribut au point d'extrémité /sso/v1/sdk/secure/session. kmsiToken doit être envoyé au point d'extrémité à partir de l'application de connexion personnalisée.

Exemple de demande Exemple de réponse

authnToken ou requestState

authorization

kmsiToken
La nouvelle variable de publication de formulaire kmsiToken ainsi que authnToken ou requestState redirigeront vers l'application avec le témoin de session d'authentification unique et le témoin KMSI.

Signature des données utiles pour les appels lancés /authorize

  1. Lorsqu'un utilisateur accède à une application Web protégée par des domaines d'identité, il entre son URL d'application, par exemple https://example.com/home/pages/profile.
  2. Le système redirige vers l'appel /authorize du domaine d'identité.
  3. Le domaine d'identité redirige l'utilisateur vers la page de connexion personnalisée déployée par le client.
  4. L'application de connexion hébergée par le client collecte les paramètres d'entrée et décode l'entrée loginCtx.
  5. Le paramètre d'entrée déchiffré correspond à l'appel GET /sso/v1/sdk/authenticate.
  6. Les données utiles contiennent keepMeSignedInEnabled pour identifier si KMSI est activé.
  7. L'application de connexion personnalisée collecte les données d'identification et les soumet au domaine d'identité.
  8. Le domaine d'identité valide les données d'identification et émet kmsiToken et authnToken.
  9. L'application de connexion personnalisée utilise authnToken et kmsiToken lors de l'appel au point d'extrémité /sso/v1/sdk/secure/session. La nouvelle syntaxe du point d'extrémité sécurisé est décrite dans Modifications à /sso/v1/sdk/secure/session.
  10. Le domaine d'identité valide authnToken, kmsiToken, puis le système d'identité émet le témoin de session d'authentification unique et le témoin KMSI.
  11. Pendant la session, le témoin KMSI est validé pour prolonger la session sans entrer de nouveau les données d'identification.