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 d'une machine d'état. Les réponses de demande informent un client d'application de ce qui doit être fait ensuite plutôt que d'obliger les utilisateurs à activer les témoins tiers dans leur navigateur. Les cookies tiers activés dans les navigateurs peuvent poser des problèmes, en particulier pour les applications B2C où les contrôles sur le 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 :
  • Vous aide à 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
  • Renforcez la sécurité de l'authentification basée sur un mot de passe à l'aide de l'authentification multifacteur en exigeant des vérifications supplémentaires, telles que l'utilisation d'un code secret à usage unique basé sur le temps ou d'un code secret SMS.
  • Autoriser les utilisateurs à sélectionner un SAML ou un fournisseur d'identités sociales externe pour l'authentification.
Note

Voir la collection Postman de l'API d'authentification des domaines d'identité pour obtenir des exemples complets de cas d'utilisation d'authentification. Téléchargez la collection et le fichier de 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 d'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 aux domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation d'authentification de 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 démarre 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 qui contient 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 de la façon suivante :
  • Décoder à l'aide d'un décodeur base64 pour obtenir les données binaires chiffrées
  • Utiliser le nom du client 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 doit effectuer l'application de connexion personnalisée.
  • 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 sociaux qui sont présentés dans la page de connexion. La page de connexion s'affiche et contient les valeurs déchiffrées du paramètre loginCtx ainsi que le jeton d'accès. La page de connexion inclut 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 la valeur IdP SAML 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 le IdP sélectionné en tant que POST FORM 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 souhaite 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 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 de 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 présente le contenu de la réponse au 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 le fichier IdP externe sélectionné pour authentification et autorisation. Lorsque la commande IdP externe est terminée, 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 aux domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation d'authentification de 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 démarre 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 qui contient 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 de la façon suivante :
  • Décoder à l'aide d'un décodeur base64 pour obtenir les données binaires chiffrées
  • Utiliser le nom du client 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 doit effectuer l'application de connexion personnalisée.
  • 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 sociaux qui sont présentés dans la page de connexion. La page de connexion s'affiche et contient les valeurs déchiffrées du paramètre loginCtx ainsi que le jeton d'accès. La page de connexion inclut 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 IdP social à 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 le IdP sélectionné en tant que POST FORM 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 souhaite 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 IdP social

L'exemple JavaScript suivant montre comment sélectionner le IdP social :
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 de 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 le IdP social sélectionné pour authentification et autorisation. Lorsque le IdP social 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 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.

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 aux domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation d'authentification de 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 démarre 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 qui contient 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 de la façon suivante :
  • Décoder à l'aide d'un décodeur base64 pour obtenir les données binaires chiffrées
  • Utiliser le nom du client 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 doit effectuer l'application de connexion personnalisée.
  • 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 sociaux qui sont présentés dans la page de connexion. La page de connexion s'affiche et contient les valeurs déchiffrées du paramètre loginCtx ainsi que le jeton d'accès. La page de connexion inclut 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 la 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 le IdP sélectionné en tant que POST FORM 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 souhaite 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 une adresse IdP externe

L'exemple JavaScript suivant montre comment sélectionner une valeur 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 de 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 présente le contenu de la réponse au 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 le fichier IdP externe sélectionné pour authentification et autorisation. Lorsque le fichier IdP externe est terminé, il redirige le navigateur vers les domaines d'identité, qui redirige ensuite le navigateur pour lancer 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 qui contient les paramètres loginCtx et signature chiffrés. Voir l'étape 1 pour des informations détaillées sur le formulaire POST et la façon de 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 doit effectuer l'application de connexion personnalisée.
  • 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 préféré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é l'authentification et l'authentification multifacteur et doit créer une session. Pour cette étape, createSession doit être listé 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 la session sécurisée

Exemple de demande

Voici un exemple du contenu de 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 présente le contenu de la réponse au 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é en tant que valeur pour nextOp, le point d'extrémité sdk/session peut être appelé directement à l'aide 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 nom d'utilisateur et 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 aux domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation d'authentification de 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 le requestState initial pour commencer 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 appName est fourni, 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 pour traiter la demande.

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

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

  • credentials: nom d'utilisateur et mot de passe

  • 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 aux domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation d'authentification de 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 le requestState initial pour commencer 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 appName est fourni, 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 pour traiter la demande.

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

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

  • 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 d'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 lors de la prochaine demande. 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 vers 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 aux conditions d'utilisation

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 rejette les conditions d'utilisation, la réponse 401 avec un message d'erreur, 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 les conditions d'utilisation.

{
 "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 montre le contenu de la réponse au format JSON lorsque le TOU est rejeté par l'utilisateur.


{
    "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 et le mot de passe et l'authentification multifacteur et retour d'un mot de passe à 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 et l'authentification multifacteur d'un utilisateur 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 aux domaines d'identité à des fins d'authentification unique.

Téléchargez la collection d'exemples de cas d'utilisation d'authentification de 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 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 des domaines d'identité pour retourner un code secret à usage unique chiffré dans la réponse de l'API au client consommateur afin que le client consommateur puisse lancer ou envoyer le code secret à 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 d'affaires. Pour configurer les domaines d'identité afin de retourner le code secret à 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 mot de passe à 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.

Chiffrement et déchiffrement

Cette mise en oeuvre utilise la spécification suivante pour chiffrer et déchiffrer le code secret à usage unique reçu. Voir PKCS #1 : Spécifications de la 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 mot de passe à 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, ApplicationCustomUI, Configuration, puis Configuration du client.
  2. Importez le certificat auto-signé dans le certificat du client approuvé et enregistrez la configuration.

Étape 4 : Demander le mot de passe à usage unique

Données utiles de la demande
Attribut Valeurs prises en charge / Exemples de valeurs Valeurs multiples Détails d'utilisation
userFlowControlledByExternalClient true / false fausse
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 Thumbprint

Lorsque cette option est spécifiée, 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 prises en charge / Exemples de valeurs Valeurs multiples Détails d'utilisation
otp

Carte

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

Lorsqu'il est présent dans la réponse, l'attribut contient le code secret à 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 d'un 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 au moyen du jeton d'accès Me à 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 aux domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation d'authentification de 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 vers l'étape suivante.

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

Obtenez le requestState initial pour commencer 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 appName est fourni, 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 pour traiter 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 :
  • credentials: nom d'utilisateur et mot de passe

  • 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 id_token au format JWT qui représente les informations d'utilisateur, la session et les données de demande courantes. Ceci est utilisé pour créer un témoin de session d'authentification unique et 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 vers 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

Après avoir extrait un 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 aux domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation d'authentification de 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.

Effectuez les étapes suivantes pour ce cas d'utilisation :

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 le requestState initial pour commencer 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 appName est fourni, 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 pour traiter la demande.

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

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

  • credentials: nom d'utilisateur et mot de passe

  • 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 PUSH Notifications est 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 correspondante a une fréquence d'authentification multifacteur = Chaque fois, le champ {{trustedDeviceSettings}} est retourné mais la valeur {{trustDurationInDays}} est retournée en tant que 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é

Authentifier à l'aide du facteur privilégié, qui, dans cet exemple de cas d'utilisation, est le service d'avis PUSH. 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 préféré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 s'authentifier avec les données d'identification d'un utilisateur, puis pour s'inscrire à 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 aux domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation d'authentification de 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 le requestState initial pour commencer 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 appName est fourni, 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 pour traiter la demande.

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

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

  • credentials: nom d'utilisateur et mot de passe

  • 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 serait 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'adhésion à l'authentification avec deuxième facteur

Cette étape lance l'inscription au code à usage unique (TOTP) basé sur le temps en ligne. 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 souhaite 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 de 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 le 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 de 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. Au bout de deux minutes, le serveur envoie le statut É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 a terminé toutes les opérations 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 politique) 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 aux domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation d'authentification de 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 le requestState initial pour commencer 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 appName est fourni, 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 pour traiter la demande.

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

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

  • credentials: nom d'utilisateur et mot de passe

  • 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 dans lesquels 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 dans lequel l'utilisateur souhaite s'inscrire
  • phoneNumber : Définit le numéro de téléphone où le texte SMS sera envoyé
  • countryCode : Définit le code de pays du numéro de téléphone où le texte 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 de 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 le 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 de 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 réussit. 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 "enrollment" 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 politique) 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 que le client veut 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 à l'authentification multifacteur et à 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 aux domaines d'identité à des fins d'authentification unique.
Conseil

Téléchargez la collection d'exemples de cas d'utilisation d'authentification de 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 le requestState initial pour commencer 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 appName est fourni, 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 pour traiter la demande.

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

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

  • credentials: nom d'utilisateur et mot de passe

  • 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 dans lesquels 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 dans lequel l'utilisateur souhaite s'inscrire
  • phoneNumber : Définit le numéro de téléphone où le texte SMS sera envoyé
  • countryCode : Définit le code de pays du numéro de téléphone où le texte 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 l'entrée à transmettre dans la demande suivante.

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

Cette étape soumet les données d'identification de facteur ainsi que requestState 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 le 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 de 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 réussit. 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 "enrollment" 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 au recouvrement 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 que requestState soit 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 :

{
    "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 une valeur de 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 le 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 d'inscription à l'authentification multifacteur
  • accountRecoveryFactor : Lorsqu'il est réglé à 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 "enrollment" permet à l'utilisateur d'inscrire un facteur supplémentaire à 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 authnFactors et qu'une session doit être créée. Selon ce qui est défini pour la politique, 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 avec nom d'utilisateur et mot de passe et me garder connecté

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

Utilisez les étapes suivantes pour configurer KMSI à l'aide d'interfaces d'application de programmation.

Cette rubrique contient également les sections suivantes :

Avant de commencer

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

Une fois l'indicateur clé de gestion des clés activé pour votre compte en nuage, effectuez les étapes suivantes pour activer l'indicateur clé de gestion des clés 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 d'être automatiquement déconnectés.
kmsiEnabled
Indique si l'ICM 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 le requestState initial pour commencer 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 appName est fourni, 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. Cela indique que ce domaine d'identité et cette application prennent en charge l'ICM. Si vous disposez d'une interface personnalisée, utilisez cet attribut pour afficher l'option Garder ma session connectée dans la page de connexion.

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

Demande
  • Opération : 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 souhaite utiliser l'ICM.
{
    "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 Statut (Activé ou Désactivé) 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 à n'importe quelle application à l'avenir sans qu'un utilisateur soit obligé de se reconnecter.

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

Demande
  • Opération : 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 les nouveaux authFactor, appName et kmsiToken envoyés 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'une valeur kmsiToken actualisée et remplace le jeton existant. Vous devez inclure cette valeur actualisée kmsiToken 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 : Commencer le flux d'authentification.

Demande
  • Opération : 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
    }
}

Une fois que vous avez 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 inclut 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é, l'utilisateur est toujours invité à authentifier le deuxième facteur. Une fois l'authentification réussie, authnToken et kmsiToken seront envoyés dans la réponse.

Demande
  • Opération : 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 d'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 code secret à 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és 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 l'extension de la session.

Demande
  • Opération : POST

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

L'API prend en charge l'ICM en tant que authFactor et authentifie l'ICM avec le paramètre requestState. Cela permet à kmsiToken avec requestState d'être extrait 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

L'ICM 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
Le nouveau formulaire post variable kmsiToken avec authnToken ou requestState redirigera 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 par /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 déterminer si l'ICM 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 sous 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. Au cours de la session, le témoin KMSI est validé pour étendre la session sans entrer de nouveau les données d'identification.