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é afin de développer une page de connexion personnalisée pour un domaine d'identité.

Remarque

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é.
Remarque

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

L'API d'authentification est basée sur le concept de machine à états. Les réponses aux demandes informent un client d'application de ce qui doit être fait ensuite plutôt que d'exiger des utilisateurs que les cookies tiers soient activés 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. L'élément requestState fourni dans chaque réponse de demande est utilisé dans la demande suivante, fournissant au client les informations dont il a besoin pour traiter la demande, puis fournissant l'ensemble d'opérations suivant autorisé.

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

Reportez-vous à la collection Postman de l'API d'authentification des domaines d'identité pour obtenir des exemples détaillés de cas d'utilisation de l'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.

Codes de statut d'API d'authentification à la demande et d'authentification à plusieurs facteurs

Authentification à l'aide 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).

Remarque

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

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

Etape 1 : lancement du 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 l'adresse /authorize. Cela lance le processus d'authentification. Au lieu de présenter la page de connexion par défaut, les domaines d'identité répondent en créant et en soumettant un formulaire HTML contenant les paramètres loginCtx et signature au navigateur.
Remarque

Vous devez exposer une adresse 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é renvoient 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. Le paramètre loginCtx étant crypté par based64, l'application de connexion personnalisée doit décrypter loginCtx en procédant comme suit :
  • Décoder à l'aide d'un décodeur base64 pour obtenir les données binaires cryptées
  • Utiliser le nom du locataire et générer une clé pour le décryptage
  • Décrypter les données à l'aide de la clé et des données binaires

Exemple de logique de décryptage pour loginCtx crypté dans Java

Voici un exemple de logique de décryptage :

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 POST et GET futurs pour les adresses d'API d'authentification des domaines d'identité.
  • nextOp : opération suivante que l'application de connexion personnalisée doit effectuer.
  • nextAuthFactors : facteurs d'authentification possibles que la page de connexion doit présenter.

Les valeurs de ces attributs définissent le facteur d'authentification, les fournisseurs d'identités et les fournisseurs de réseaux sociaux qui sont présentés sur la page de connexion. La page de connexion apparaît avec les valeurs décryptées du paramètre loginCtx et le jeton d'accès. La page de connexion inclut JavaScript utilisé pour effectuer des appels AJAX vers des domaines d'identité.

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

L'utilisateur sélectionne le SAML externe IdP à utiliser pour l'authentification à partir de la page de connexion personnalisée qui apparaît. La page de connexion personnalisée doit construire, puis soumettre les informations requises pour le fichier IdP sélectionné en tant que format HTML POST à l'adresse /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: du fichier 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 l'élément IdP reçu dans la réponse de l'étape 1
  • appName: nom 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 SAML

L'exemple JavaScript suivant montre comment sélectionner le IdP SAML :
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 l'autotest FORM POST vers l'adresse /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 illustre 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 l'option IdP externe est terminée, le navigateur est redirigé vers les domaines d'identité. Les domaines d'identité valident la réponse d'assertion et vérifient si une authentification supplémentaire, telle que l'authentification à plusieurs facteurs, 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. Sinon, les domaines d'identité créent une soumission automatique HTML FORM POST vers la page de connexion personnalisée contenant authnToken. La page de connexion personnalisée crée ensuite la session. Reportez-vous à la section Creating a 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.

Remarque

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

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

Etape 1 : lancement du 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 l'adresse /authorize. Cela lance le processus d'authentification. Au lieu de présenter la page de connexion par défaut, les domaines d'identité répondent en créant et en soumettant un formulaire HTML contenant les paramètres loginCtx et signature au navigateur.
Remarque

Vous devez exposer une adresse 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é renvoient 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. Le paramètre loginCtx étant crypté par based64, l'application de connexion personnalisée doit décrypter loginCtx en procédant comme suit :
  • Décoder à l'aide d'un décodeur base64 pour obtenir les données binaires cryptées
  • Utiliser le nom du locataire et générer une clé pour le décryptage
  • Décrypter les données à l'aide de la clé et des données binaires

Exemple de logique de décryptage pour loginCtx crypté dans Java

Voici un exemple de logique de décryptage :

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 POST et GET futurs pour les adresses d'API d'authentification des domaines d'identité.
  • nextOp : opération suivante que l'application de connexion personnalisée doit effectuer.
  • nextAuthFactors : facteurs d'authentification possibles que la page de connexion doit présenter.

Les valeurs de ces attributs définissent le facteur d'authentification, les fournisseurs d'identités et les fournisseurs de réseaux sociaux qui sont présentés sur la page de connexion. La page de connexion apparaît avec les valeurs décryptées du paramètre loginCtx et le jeton d'accès. La page de connexion inclut JavaScript utilisé pour effectuer des appels AJAX vers des domaines d'identité.

Etape 2 : sélection d'un fournisseur d'identités sociales

L'utilisateur sélectionne le réseau social IdP qu'il souhaite utiliser pour l'authentification à partir de la page de connexion personnalisée qui apparaît. La page de connexion personnalisée doit construire, puis soumettre les informations requises pour le fichier IdP sélectionné en tant que format HTML POST à l'adresse /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: du fichier 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 l'élément IdP reçu dans la réponse de l'étape 1
  • appName: nom 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 réseau social IdP

L'exemple JavaScript suivant montre comment sélectionner le réseau social 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 l'autotest FORM POST vers l'adresse /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 illustre 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 réseau social IdP sélectionné pour authentification et autorisation. Lorsque le réseau social IdP est terminé, le navigateur est redirigé vers les domaines d'identité. Les domaines d'identité valident la réponse d'assertion et vérifient si une authentification supplémentaire, telle que l'authentification à plusieurs facteurs, 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. Sinon, les domaines d'identité créent une soumission automatique HTML FORM POST vers la page de connexion personnalisée contenant authnToken. La page de connexion personnalisée crée ensuite la session. Reportez-vous à la section Creating a Session.

Authentification à l'aide d'un fournisseur d'identités SAML externe et de l'authentification à plusieurs facteurs

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 de l'authentification multifacteur (MFA).

Remarque

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

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

Etape 1 : lancement du 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 l'adresse /authorize. Cela lance le processus d'authentification. Au lieu de présenter la page de connexion par défaut, les domaines d'identité répondent en créant et en soumettant un formulaire HTML contenant les paramètres loginCtx et signature au navigateur.
Remarque

Vous devez exposer une adresse 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é renvoient 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. Le paramètre loginCtx étant crypté par based64, l'application de connexion personnalisée doit décrypter loginCtx en procédant comme suit :
  • Décoder à l'aide d'un décodeur base64 pour obtenir les données binaires cryptées
  • Utiliser le nom du locataire et générer une clé pour le décryptage
  • Décrypter les données à l'aide de la clé et des données binaires

Exemple de logique de décryptage pour loginCtx crypté dans Java

Voici un exemple de logique de décryptage :

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 POST et GET futurs pour les adresses d'API d'authentification des domaines d'identité.
  • nextOp : opération suivante que l'application de connexion personnalisée doit effectuer.
  • nextAuthFactors : facteurs d'authentification possibles que la page de connexion doit présenter.

Les valeurs de ces attributs définissent le facteur d'authentification, les fournisseurs d'identités et les fournisseurs de réseaux sociaux qui sont présentés sur la page de connexion. La page de connexion apparaît avec les valeurs décryptées du paramètre loginCtx et le jeton d'accès. La page de connexion inclut JavaScript utilisé pour effectuer des appels AJAX vers des domaines d'identité.

Etape 2 : sélection d'un fournisseur d'identités externe

L'utilisateur sélectionne l'élément IdP externe à utiliser pour l'authentification à partir de la page de connexion personnalisée qui apparaît. La page de connexion personnalisée doit construire, puis soumettre les informations requises pour le fichier IdP sélectionné en tant que format HTML POST à l'adresse /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: du fichier 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 l'élément IdP reçu dans la réponse de l'étape 1
  • appName: nom 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 externe

L'exemple JavaScript suivant montre comment sélectionner un élément 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 l'autotest FORM POST vers l'adresse /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 illustre 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é, puis le redirige vers le navigateur pour commencer la vérification en 2 étapes.

Etape 3 : Authentification à l'aide du facteur préféré (SMS)

Les étapes initiales pour commencer la vérification en 2 étapes sont similaires à l'étape 1. Les domaines d'identité créent et soumettent un formulaire HTML contenant les paramètres loginCtx et signature cryptés. Reportez-vous à l'étape 1 pour obtenir des informations détaillées sur le formulaire POST et sur la façon de le déchiffrer.

Une fois le paramètre loginCtx décrypté, 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 POST et GET futurs pour les adresses d'API d'authentification des domaines d'identité.
  • nextOp : opération suivante que l'application de connexion personnalisée doit effectuer.
  • nextAuthFactors : facteurs d'authentification possibles que la page de connexion doit présenter.

Les valeurs de ces attributs définissent le facteur d'authentification (dans cet exemple, il s'agit de SMS) à présenter sur la page de connexion. L'utilisateur saisit 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 présente 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 illustre 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 initialement demandée. Reportez-vous à la section Creating a Session.

Création d'une session

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

Remarque

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é.
Remarque

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

Pour plus d'informations sur l'utilisation de l'API Authentifier, reportez-vous aux autres cas d'emploi dans Utilisation de l'API Authentifier.

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

Pour l'adresse /sso/v1/sdk/secure/session :
  • requestState: reçu dans la dernière réponse

    Ou

  • 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 l'autotest FORM POST vers l'adresse /sso/v1/sdk/secure/session :

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

Exemple de réponse

L'exemple suivant illustre 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 répertorié en tant que 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, l'adresse sdk/session peut être appelée directement à l'aide de requestState uniquement.

Exemple de demande

L'exemple suivant montre la demande de jeton à l'adresse /sso/v1/sdk/authenticate au format JSON :

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

Exemple de réponse

L'exemple suivant illustre 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 utilisateur et mot de passe

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

Remarque

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

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

Utilisez les étapes suivantes pour le cas d'emploi.

Etape 1 : lancement du flux d'authentification

Obtenez le requestState initial pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant illustre 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}}
Remarque

appName est facultatif. appName est le nom de l'application à laquelle le client souhaite accéder. Si un appName est fourni, les stratégies de connexion propres à l'application sont traitées et le client doit répondre aux facteurs requis en fonction de cette stratégie.

Exemple de réponse

L'exemple suivant illustre 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'emploi, credSubmit doit être envoyé à l'étape suivante. Le fichier requestState contient les données contextuelles nécessaires au traitement de la demande.

Etape 2 : Soumettre les informations d'identification de l'utilisateur

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

  • Nom utilisateur et mot de passe credentials:

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

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

Exemple de demande

L'exemple suivant illustre 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 illustre 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 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 PT

Ce cas d'utilisation fournit un exemple étape par étape d'utilisation de l'API Authentifier les domaines d'identité pour s'authentifier avec les informations d'identification d'un utilisateur avec le consentement PT. Lorsque l'utilisateur accepte le consentement, il est redirigé vers cette page d'application.

Remarque

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

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

Etape 1 : lancement du flux d'authentification

Obtenez le requestState initial pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant illustre 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}}
Remarque

appName est facultatif. appName est le nom de l'application à laquelle le client souhaite accéder. Si un appName est fourni, les stratégies de connexion propres à l'application sont traitées et le client doit répondre aux facteurs requis en fonction de cette stratégie.

Exemple de réponse

L'exemple suivant illustre 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'emploi, credSubmit doit être envoyé à l'étape suivante. Le fichier requestState contient les données contextuelles nécessaires au traitement de la demande.

Etape 2 : Soumettre les informations d'identification de l'utilisateur sans authentification à plusieurs facteurs

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

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

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

Si le nom utilisateur et les mots de passe sont valides, le serveur répond avec l'instruction PT dans l'environnement local spécifié dans le profil de l'utilisateur. Le serveur invite également l'utilisateur à fournir ses informations d'identification de consentement dans la demande suivante. Si l'instruction PT n'est pas présente dans l'environnement local de l'utilisateur fr, la réponse 401 avec le message d'erreur AUTH-3036 : Déclaration des conditions d'utilisation pour l'environnement local fr n'est pas ajoutée s'affiche.

Exemple de demande

L'exemple suivant présente le contenu de la demande POST au format JSON vers l'adresse /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 la PT pour les paramètres régionaux de l'utilisateur n'est pas ajoutée :

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

Etape 3 : Fournir le consentement PT

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 la PT.

{
 "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 la PT.

{
 "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'instruction PT.

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

Exemple de réponse d'erreur

La section suivante présente le contenu de la réponse au format JSON lorsque la PT est rejetée par l'utilisateur.


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

Authentification à l'aide du nom utilisateur, du mot de passe et de l'authentification à plusieurs facteurs, et renvoi 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 s'authentifier avec les informations d'identification d'un utilisateur et l'authentification multifacteur (MFA) et pour renvoyer un mot de passe à usage unique crypté dans la réponse.

Remarque

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

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

Les domaines d'identité peuvent être configurés pour envoyer un code secret à usage unique basé sur le temps (OTP) directement à un utilisateur pour authentification ou pour que le code secret soit crypté 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 de passe à usage unique basés sur le temps (OTP) à l'application Oracle Mobile Authenticator (OMA) ou envoyer les codes de passe à usage unique par courriel à l'adresse électronique principale de l'utilisateur. Dans les deux cas, les domaines d'identité génèrent le mot de passe à usage unique, l'envoient directement à l'utilisateur et celui-ci saisit le code pour l'authentification. Pour savoir comment définir ces options à l'aide de REST, reportez-vous à Inscription à un facteur d'authentification avec vérification de facteur - SMS et à Inscription à un facteur d'authentification avec vérification de facteur - Courriel.

Les administrateurs peuvent également configurer des domaines d'identité pour qu'ils renvoient un mot de passe à usage unique crypté dans la réponse d'API au client consommateur afin que le client consommateur puisse lancer ou envoyer le mot de passe à usage unique à l'utilisateur. Cette approche présente deux avantages : elle permet au client destinataire de personnaliser le message d'authentification et de modifier les détails de l'expéditeur en fonction de ses besoins. Pour configurer les domaines d'identité afin qu'ils renvoient le mot de passe à usage unique crypté dans la réponse, le client destinataire doit effectuer les étapes suivantes.
  1. Etape 1 : créer une application CustomUI

  2. Etape 2 : génération d'une paire de clés pour un certificat auto-signé

  3. Etape 3 : configuration de l'application pour renvoyer le mot de passe à usage unique dans la réponse

  4. Etape 4 : Demander le mot de passe à usage unique

Remarque

Ces étapes supposent que l'authentification à plusieurs facteurs est activée et qu'une stratégie de connexion est créée pour l'authentification à plusieurs facteurs. Reportez-vous à Configuration des paramètres d'authentification à plusieurs facteurs.

Cryptage et décryptage

Cette implémentation utilise la spécification suivante pour crypter et décrypter le code de mot de passe à usage unique reçu. Reportez-vous à la section PKCS #1 : RSA Cryptography Specifications, Version 2.0, section 7.1 RSAES-OAEP.

Code de décryptage de mot de passe à usage unique

Utilisez le code Java suivant pour décrypter 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();
            }
    }
    
}

Etape 1 : créer une application CustomUI

Pour plus d'informations sur les applications personnalisées, reportez-vous à Ajouter des applications.

Etape 2 : génération d'une paire de clés pour un certificat auto-signé

Pour recevoir le mot de passe à usage unique dans la réponse, le client destinataire 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. Ensuite, générez 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
    

Etape 3 : configuration de l'application pour renvoyer 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 volet de navigation, cliquez sur Applications, CustomUI application, Configuration, puis sur Configuration client.
  2. Importez le certificat auto-signé dans le certificat de client sécurisé et enregistrez la configuration.

Etape 4 : Demander le mot de passe à usage unique

Charge utile de la demande
Attribut Valeurs prises en charge / exemples de valeur Valeurs multiples Détails d'utilisation
userFlowControlledByExternalClient True / False False
Définir cette option sur
true
et le mot de passe à usage unique sera renvoyé dans la réponse dans le format crypté spécifié.

Remarque : le certificat utilisé pour le cryptage est téléchargé vers l'application à l'avance et est référencé à l'aide de l'attribut x5t dans l'exemple de demande tel que mentionné ci-dessous.

x5t Chaîne / X509 Empreinte numérique du certificat SHA-1

Lorsque cette option est indiquée, le service utilise ce certificat téléchargé pour crypter les données de mot de passe à usage unique.

Remarque : 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}}"
}
Charge utile de réponse
Attribut Valeurs prises en charge / exemples de valeur Valeurs multiples Détails d'utilisation
otp

Correspondance

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

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

  • value : valeur cryptée.
  • alg : algorithme utilisé pour le cryptage.
  • x5t : empreinte numérique SHA-1 X509 du certificat utilisé pour le cryptage.

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 les informations utilisateur via le jeton d'accès Moi à l'aide de l'API d'authentification.

Remarque

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

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

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

Etape 1 : lancement du flux d'authentification

Obtenez le requestState initial pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant illustre 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}}
Remarque

appName est facultatif. appName est le nom de l'application à laquelle le client souhaite accéder. Si un appName est fourni, les stratégies de connexion propres à l'application sont traitées et le client doit répondre aux facteurs requis en fonction de cette stratégie.

Exemple de réponse

L'exemple suivant illustre 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'emploi, credSubmit doit être envoyé à l'étape suivante. Le fichier requestState contient les données contextuelles nécessaires au traitement de la demande.

Etape 2 : Soumettre les informations d'identification de l'utilisateur

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

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

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

AuthnToken est le fichier id_token au format JWT qui représente les informations utilisateur, la session et les données de demande en cours. Permet de créer un cookie de session SSO et de rediriger vers l'URL cible. Si le nom utilisateur et le mot de passe sont valides, AuthnToken est extrait.

Exemple de demande

L'exemple suivant présente le contenu de la demande POST au format JSON vers l'adresse /sso/v1/sdk/authenticate :

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

Exemple de réponse

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

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

Etape 3 : génération d'un jeton d'accès

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

Exemple de demande

L'exemple suivant illustre 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 illustre le contenu de la réponse au format JSON :

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

Etape 4 : Obtenir les informations 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 d'e-mail, etc.

Exemple de demande

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

{{HOST}}/admin/v1/Me

Exemple de réponse

L'exemple suivant illustre le contenu de la réponse au format JSON avec des informations 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 à l'aide du nom utilisateur, du mot de passe et de l'authentification à plusieurs facteurs

Ce cas d'utilisation fournit un exemple étape par étape d'utilisation de l'API REST des domaines d'identité pour l'authentification à l'aide des informations d'identification d'un utilisateur et de l'authentification multifacteur (MFA).

Remarque

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

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

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

Remarque

Ces étapes supposent que l'authentification à plusieurs facteurs est activée et qu'une stratégie de connexion est créée pour l'authentification à plusieurs facteurs. Reportez-vous à Configuration des paramètres d'authentification à plusieurs facteurs.

Etape 1 : lancement du flux d'authentification

Obtenez le requestState initial pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant illustre 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}}
Remarque

appName est facultatif. appName est le nom de l'application à laquelle le client souhaite accéder. Si un appName est fourni, les stratégies de connexion propres à l'application sont traitées et le client doit répondre aux facteurs requis en fonction de cette stratégie.

Exemple de réponse

L'exemple suivant illustre 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'emploi, credSubmit doit être envoyé à l'étape suivante. Le fichier requestState contient les données contextuelles nécessaires au traitement de la demande.

Etape 2 : Soumettre les informations d'identification de l'utilisateur

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

  • Nom utilisateur et mot de passe credentials:

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

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

Exemple de demande

L'exemple suivant illustre 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 préféré :

{
    "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
    }
}
Remarque

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

Si le paramètre Appareil sécurisé est activé au niveau du locataire et si la règle de règle de connexion mise en correspondance a une fréquence d'authentification à plusieurs facteurs = Chaque fois, le champ {{trustedDeviceSettings}} est renvoyé, mais la valeur {{trustDurationInDays}} est renvoyée en tant que 0.
"trustedDeviceSettings": {
       "trustDurationInDays": 0
 }

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

Etape 3 : Authentification à l'aide du facteur préféré

Authentifiez-vous à l'aide du facteur préféré, qui dans cet exemple de cas d'emploi est Notifications 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 présente 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 illustre le contenu de la réponse au format JSON :

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

Authentification à l'aide du nom utilisateur et du mot de passe, et inscription à l'authentification à plusieurs facteurs

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 informations d'identification d'un utilisateur, puis pour l'inscription à l'authentification multifacteur (MFA).

Remarque

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

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

Ces étapes supposent que l'authentification à plusieurs facteurs est activée et qu'une stratégie de connexion est créée pour l'authentification à plusieurs facteurs. Reportez-vous à Configuration des paramètres d'authentification à plusieurs facteurs.

Etape 1 : lancement du flux d'authentification

Obtenez le requestState initial pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant illustre 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}}
Remarque

appName est facultatif. appName est le nom de l'application à laquelle le client souhaite accéder. Si un appName est fourni, les stratégies de connexion propres à l'application sont traitées et le client doit répondre aux facteurs requis en fonction de cette stratégie.

Exemple de réponse

L'exemple suivant illustre 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'emploi, credSubmit doit être envoyé à l'étape suivante. Le fichier requestState contient les données contextuelles nécessaires au traitement de la demande.

Etape 2 : Soumettre les informations d'identification de l'utilisateur

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

  • Nom utilisateur et mot de passe credentials:

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

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

Exemple de demande

L'exemple suivant illustre 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 illustre 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'emploi, étant donné que l'authentification à plusieurs facteurs est définie comme facultative dans la stratégie de connexion (indiquée par la valeur false pour l'attribut enrollmentRequired), l'utilisateur a le choix entre s'inscrire ou ignorer l'inscription. Si l'authentification à plusieurs facteurs est requise, la seule valeur nextOp serait enrollment.

Dans cet exemple de cas d'emploi, enrollment est envoyé à l'étape suivante pour lancer l'inscription du facteur d'authentification à plusieurs facteurs 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.

Etape 3 : Lancer l'inscription à l'authentification du deuxième facteur

Cette étape lance l'inscription au code secret à usage unique (TOTP) 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 illustre le contenu de la demande POST au format JSON :

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

Exemple de réponse

L'exemple suivant illustre 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'emploi, credSubmit est envoyé à l'étape suivante.
Remarque

La valeur de content commence toujours par oraclemobileauthenticator//.

Etape 4 : Soumettre les informations d'identification de facteur

Cette étape soumet les informations d'identification de facteur dans requestState qui ont été reçues dans la réponse de l'étape 3. La charge utile de demande ne contient 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 présente le contenu de la demande POST au format JSON pour soumettre les informations d'identification de facteur :

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

Exemple de réponse

Le statut success apparaît dans la réponse lorsque l'application OMA vers le canal arrière du serveur est terminée et que la vérification optCode a réussi. L'exemple suivant illustre 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'emploi, createToken est envoyé à l'étape suivante.

Exemple de réponse en attente

Le statut pending apparaît lorsque la communication entre l'application OMA et le canal arrière du serveur n'est pas terminée. Le client continue à interroger toutes les 10 secondes et continue à interroger pendant deux minutes. Au bout de deux minutes, le serveur envoie le statut d'échec si la vérification otpCode échoue.

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

Etape 5 : création du jeton d'authentification

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

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

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

Exemple de demande

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

Exemple de réponse

L'exemple suivant illustre 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 informations d'identification d'un utilisateur, puis pour l'inscription à la récupération de compte.

Remarque

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

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

Ces étapes supposent que plusieurs facteurs sont activés pour la récupération de compte, mais que l'inscription à l'authentification à plusieurs facteurs n'est pas configurée. Reportez-vous à Configuration de la récupération de compte et à Configuration des paramètres d'authentification à plusieurs facteurs.

Etape 1 : lancement du flux d'authentification

Obtenez le requestState initial pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant illustre 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}}
Remarque

appName est facultatif. appName est le nom de l'application à laquelle le client souhaite accéder. Si un appName est fourni, les stratégies de connexion propres à l'application sont traitées et le client doit répondre aux facteurs requis en fonction de cette stratégie.

Exemple de réponse

L'exemple suivant illustre 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'emploi, credSubmit doit être envoyé à l'étape suivante. Le fichier requestState contient les données contextuelles nécessaires au traitement de la demande.

Etape 2 : Soumettre les informations d'identification de l'utilisateur

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

  • Nom utilisateur et mot de passe credentials:

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

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

Exemple de demande

L'exemple suivant illustre 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 illustre 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'emploi, l'utilisateur doit s'inscrire à la récupération de compte (indiquée par la valeur true pour l'attribut accRecEnrollmentRequired:true). nextAuthFactors indique les facteurs auxquels l'utilisateur peut s'inscrire pour la récupération de compte.

Dans cet exemple de cas d'emploi, l'inscription est envoyée à l'étape suivante pour lancer l'inscription à la récupération de compte pour l'utilisateur.

Etape 3 : Lancer l'inscription à la récupération de compte

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

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

Exemple de demande

L'exemple suivant illustre 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 illustre 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'emploi, credSubmit est envoyé à l'étape suivante. L'élément otpCode est envoyé via SMS à l'appareil de l'utilisateur.

Etape 4 : Soumettre les informations d'identification de facteur

Cette étape soumet les informations d'identification de facteur dans requestState qui ont été reçues dans la réponse de l'étape 3. La charge utile de demande ne contient 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 présente le contenu de la demande POST au format JSON pour soumettre les informations 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 illustre 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 définie sur 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" (Inscription) permet à l'utilisateur de basculer vers un autre facteur pour s'inscrire à la récupération de compte. Dans cet exemple de cas d'emploi, createToken est envoyé à l'étape suivante.

Etape 5 : création du jeton d'authentification

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

Exemple de demande

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

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

Exemple de réponse

L'exemple suivant illustre 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, inscription à la récupération de compte et à l'authentification à plusieurs facteurs

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 informations d'identification d'un utilisateur, puis pour l'inscription à la récupération de compte et à l'authentification multifacteur (MFA).

Remarque

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

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

Ces étapes supposent que la récupération de compte et l'authentification à plusieurs facteurs sont activées et qu'une stratégie de connexion est créée pour l'authentification à plusieurs facteurs. Reportez-vous à Configuration de la récupération de compte et à Configuration des paramètres d'authentification à plusieurs facteurs.

Etape 1 : lancement du flux d'authentification

Obtenez le requestState initial pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant illustre 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}}
Remarque

appName est facultatif. appName est le nom de l'application à laquelle le client souhaite accéder. Si un appName est fourni, les stratégies de connexion propres à l'application sont traitées et le client doit répondre aux facteurs requis en fonction de cette stratégie.

Exemple de réponse

L'exemple suivant illustre 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'emploi, credSubmit doit être envoyé à l'étape suivante. Le fichier requestState contient les données contextuelles nécessaires au traitement de la demande.

Etape 2 : Soumettre les informations d'identification de l'utilisateur

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

  • Nom utilisateur et mot de passe credentials:

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

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

Exemple de demande

L'exemple suivant illustre 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 illustre 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'emploi, l'utilisateur doit s'inscrire à la récupération de compte (indiquée par la valeur true pour l'attribut accRecEnrollmentRequired:true). nextAuthFactors indique les facteurs auxquels l'utilisateur peut s'inscrire pour la récupération de compte.

Dans cet exemple de cas d'emploi, l'inscription est envoyée à l'étape suivante pour lancer l'inscription à la récupération de compte pour l'utilisateur.

Etape 3 : Lancer l'inscription à la récupération de compte

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

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

Exemple de demande

L'exemple suivant illustre 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 illustre 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'emploi, credSubmit est envoyé à l'étape suivante. L'élément otpCode est envoyé via SMS à l'appareil de l'utilisateur. Les informations d'identification indiquent à l'utilisateur quelle entrée est nécessaire pour transmettre la demande suivante.

Etape 4 : Soumettre les informations d'identification de facteur

Cette étape soumet les informations d'identification de facteur ainsi que les informations d'identification requestState reçues dans la réponse de l'étape 3. La charge utile de demande ne contient 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 présente le contenu de la demande POST au format JSON pour soumettre les informations 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 illustre 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 définie sur 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" (Inscription) permet à l'utilisateur de basculer vers un autre facteur pour s'inscrire à la récupération de compte. Dans cet exemple de cas d'emploi, createToken est envoyé à l'étape suivante.

Etape 5 : création du jeton d'authentification

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

Exemple de demande

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

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

Exemple de réponse

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

Etape 6 : Définir SMS comme facteur d'authentification à plusieurs facteurs par défaut dans le chevauchement

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

Le client doit inclure les attributs suivants :

  • authFactor : indique le facteur auquel s'inscrire pour l'authentification à plusieurs facteurs
  • accountRecoveryFactor : lorsque la valeur est définie sur Vrai, indique que l'utilisateur souhaite réutiliser le facteur de récupération de compte déjà inscrit pour l'authentification à plusieurs facteurs.

Exemple de demande

L'exemple suivant illustre 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" (Inscription) permet à l'utilisateur d'inscrire un facteur supplémentaire pour l'authentification à plusieurs facteurs. Dans cet exemple de cas d'emploi, createToken est envoyé à l'étape suivante.

Etape 7 : création du jeton d'authentification

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

Exemple de demande

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

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

Exemple de réponse

L'exemple suivant illustre 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 maintien de la connexion

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

Procédez comme suit pour configurer KMSI à l'aide d'interfaces d'application de programmation.

Cette rubrique contient également les informations suivantes :

Avant de commencer

Etape 1 : activation du KMSI pour un domaine d'identité

Une fois que KMSI a été activé pour votre compte cloud, procédez comme suit pour activer KMSI pour un domaine d'identité IAM.
Remarque

Si vous souhaitez utiliser l'interface utilisateur pour activer KMSI, reportez-vous à Modification des paramètres de session et à Création d'une stratégie de connexion.
  1. Obtenez le jeton d'accès d'administrateur de domaine d'identité pour votre compte.
  2. Exécutez GET sur l'adresse /admin/v1/KmsiSettings/KmsiSettings. Le système renvoie KmsiSettings.
  3. Mettez à jour les attributs nécessaires et exécutez PUT sur l'adresse /admin/v1/KmsiSettings/KmsiSettings.
tokenValidityInDays
Saisissez le nombre de jours pendant lesquels les utilisateurs peuvent rester connectés avant de se déconnecter automatiquement.
kmsiEnabled
Indique si KMSI est activé pour le domaine d'identité.
maxAllowedSessions
Saisissez le nombre maximal de sessions de connexion 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"
}

Etape 2 : lancement du flux d'authentification

Obtenez le requestState initial pour démarrer le flux d'authentification.

Exemple de demande

L'exemple suivant illustre 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}}
Remarque

appName est facultatif. appName est le nom de l'application à laquelle le client souhaite accéder. Si un appName est fourni, les stratégies de connexion propres à l'application sont traitées et le client doit répondre aux facteurs requis en fonction de cette stratégie.

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 KMSI. Si vous disposez d'une interface personnalisée, utilisez cet attribut pour afficher l'option Garder ma connexion sur la page de connexion.

Etape 3 : Soumettre les informations d'identification de l'utilisateur avec KMSI

Demande
  • Opération : POST
  • Adresse : /sso/v1/sdk/authenticate

Exemple de demande
Remarque

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

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

Exemple de réponse

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

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

Etape 4 : réémettre authnToken après l'expiration de la session

Demande
  • Opération : POST

  • Adresse : /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 de nouveaux éléments authFactor, appName et kmsiToken envoyés dans la demande. SSO évalue la demande et renvoie authnToken et la dernière mise à jour kmsiToken dans la réponse. Il s'agit d'un élément kmsiToken actualisé qui remplace le jeton existant. Vous devez inclure cette version actualisée de kmsiToken dans la demande suivante.

Etape 5 : Soumettre les informations d'identification de l'utilisateur avec le flux KMSI et MFA

Lancez GET sur /sso/v1/sdk/authenticate à partir de l'Step 2 : Begin the Authentication Flow.

Demande
  • Opération : POST

  • Adresse : /sso/v1/sdk/authenticate

Exemple de réponse

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

Exemple de réponse

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

Après avoir obtenu le code secret à usage unique (OTP) sur le périphérique, 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 élément kmsiToken actualisé.

Exemple de réponse

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

Etape 6 : Réémettre authnToken après l'expiration de la session lorsqu'un facteur d'authentification à plusieurs facteurs 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é à s'authentifier. Ce n'est qu'après une authentification réussie que authnToken et kmsiToken seront envoyés dans la réponse.

Demande
  • Opération : POST

  • Adresse : /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 question de vérification d'authentification à plusieurs facteurs.

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é à saisir le mot de passe à usage unique sur le périphérique. Fournissez la charge utile ci-dessous avec le mot de passe à 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 cookie KMSI. Après l'expiration de la session, l'application envoie un appel d'autorisation au système d'identités avec les éléments redirectUrl, state, nonce, etc. Dans la réponse, le système d'identité renvoie la valeur requestState dans loginCtx. Ce requestState avec le jeton KMSI est transmis pour rediriger l'application requise après l'extension de la session.

Demande
  • Opération : POST

  • Adresse : /sso/v1/sdk/authenticate

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

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

Exemple de demande

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

Exemple de réponse

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

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

KMSI requiert l'ajout d'un nouvel attribut à l'adresse /sso/v1/sdk/secure/session. kmsiToken doit être envoyé à l'adresse à partir de l'application de connexion personnalisée.

Exemple de demande Exemple de réponse

authnToken ou requestState

authorization

kmsiToken
La nouvelle variable de publication de formulaire kmsiToken avec authnToken ou requestState redirigera vers l'application avec le cookie de session SSO et le cookie KMSI.

Signature de charge utile 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 saisit son URL d'application, par exemple https://example.com/home/pages/profile.
  2. Le système redirige vers l'appel de domaine d'identité /authorize.
  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écrypté correspond à l'appel GET /sso/v1/sdk/authenticate.
  6. La charge utile contient keepMeSignedInEnabled pour déterminer si KMSI est activé.
  7. L'application de connexion personnalisée collecte les informations d'identification et les soumet au domaine d'identité.
  8. Le domaine d'identité valide les informations d'identification et émet kmsiToken et authnToken.
  9. L'application de connexion personnalisée utilise authnToken et kmsiToken lors de l'appel de l'adresse /sso/v1/sdk/secure/session. La nouvelle syntaxe de l'adresse sécurisée est décrite à la section Changes to /sso/v1/sdk/secure/session.
  10. Le domaine d'identité valide authnToken, kmsiToken, puis le système d'identité émet le cookie de session SSO et le cookie KMSI.
  11. Pendant la session, le cookie KMSI est validé pour étendre la session sans ressaisir les informations d'identification.