Utilizzo dell'interfaccia API di autenticazione per sviluppare una pagina di accesso personalizzata

Questo caso d'uso fornisce un esempio dettagliato dell'uso dell'API REST dei domini di Identity per sviluppare una pagina di collegamento personalizzata per un dominio di Identity.

Nota

Utilizzare questa interfaccia API di autenticazione solo se si sta creando un'esperienza di login end-to-end personalizzata sviluppando un'applicazione di accesso personalizzata che deve essere utilizzata dai domini di Identity.
Nota

Questa interfaccia API di autenticazione non può essere utilizzata per integrare le applicazioni con i domini di Identity ai fini del Single Sign-On.

L'API di autenticazione si basa sul concetto di computer di stato. Le risposte alle richieste informano un client dell'applicazione cosa deve essere fatto dopo piuttosto che richiedere agli utenti di abilitare i cookie di terze parti nei loro browser. I cookie di terze parti abilitati nei browser possono presentare problemi, soprattutto per le applicazioni B2C in cui i controlli sul comportamento dell'utente finale non possono essere applicati. Il valore requestState fornito in ogni risposta alla richiesta successiva viene utilizzato nella richiesta successiva, fornendo al client le informazioni necessarie per elaborare la richiesta e quindi fornire il set successivo di operazioni consentite.

L'API di autenticazione può:
  • Consente di verificare le credenziali di nome utente e password per un utente come autenticazione principale.
  • Supporta la registrazione degli utenti con fattori MFA abilitati dall'amministratore
  • Rafforza la sicurezza dell'autenticazione basata su password utilizzando l'autenticazione a più fattori (MFA) richiedendo ulteriori verifiche, come l'uso di un passcode monouso basato sul tempo o di un passcode SMS.
  • Consente agli utenti di selezionare un SAML o un provider Social Identity esterno per l'autenticazione.
Nota

Per alcuni esempi di casi d'uso di autenticazione estesi, vedere la raccolta Postman API di autenticazione dei domini di Identity. Scaricare la raccolta e il file delle variabili globali dalla cartella idcs-authn-api-rest-clients all'interno di GitHub, quindi importarli in Postman.

Autentica e su richiesta codici stato API MFA

Autenticazione con un provider di identità SAML esterno

In questo caso d'uso vengono illustrati i passi per utilizzare i domini di Identity per l'autenticazione mediante un provider di identità SAML esterno (IdP).

Nota

  • Utilizzare questa interfaccia API di autenticazione solo se si sta creando la propria esperienza di login end-to-end sviluppando un'applicazione di collegamento personalizzata che deve essere utilizzata dai domini di Identity.
  • Questa interfaccia API di autenticazione non può essere utilizzata per integrare le applicazioni con i domini di Identity ai fini del Single Sign-On.
Suggerimento

Scaricare la raccolta di esempi di casi d'uso di autenticazione dei domini di Identity e il file delle variabili globali dalla cartella idcs-authn-api-rest-clients all'interno del repository idm-samples GitHub, quindi importarli in Postman.
Per il caso d'uso, attenersi alla procedura riportata di seguito. Ogni passo contiene esempi di richieste e risposte:

Passo 1: avviare il flusso di autenticazione

Un utente apre una finestra del browser per accedere a una pagina protetta.

In background, la richiesta di autenticazione viene intercettata dai domini di Identity e reindirizzata all'endpoint /authorize. Questo avvia il processo di autenticazione. Anziché presentare la pagina di accesso predefinita, i domini di Identity rispondono creando e sottomettendo al browser un modulo HTML contenente i parametri loginCtx e signature.
Nota

È necessario esporre un endpoint per ricevere l'invio del modulo e leggere i due valori dei parametri.

Esempio di form HTML POST

Di seguito è riportato un esempio di POST form HTML restituito dai domini di Identity per richiamare la pagina di accesso personalizzata.

<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>
Il browser riceve il codice HTML che contiene JavaScript per inviare automaticamente il modulo alla pagina di accesso personalizzata. Poiché il parametro loginCtx è cifrato con based64, l'applicazione di accesso personalizzata deve decifrare loginCtx effettuando le operazioni riportate di seguito.
  • Decodificare utilizzando un decoder base64 per ottenere i dati binari cifrati
  • Utilizzare il nome del tenant e generare una chiave per la decifrazione
  • Decifrare i dati utilizzando i dati chiave e binari

Esempio di logica di decifrazione per loginCtx cifrato in Java

Di seguito è riportata una logica di decifrazione di esempio.

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;
    }

Esempio di risposta

La risposta deve essere simile all'esempio seguente:

{
  "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"
    ]
  }
}
Il parametro loginCtx contiene alcuni attributi importanti:
  • requestState: lo stato del processo di autenticazione. Deve essere utilizzato nei POST e nei GET futuri per gli endpoint API di autenticazione dei domini di Identity.
  • nextOp: l'operazione successiva che l'applicazione di accesso personalizzata deve eseguire.
  • nextAuthFactors: i possibili fattori di autenticazione che la pagina di accesso deve presentare.

I valori di questi attributi definiscono il fattore di autenticazione, i provider di identità e i provider social visualizzati nella pagina di accesso. Viene visualizzata la pagina di accesso contenente i valori decifrati del parametro loginCtx insieme al token di accesso. La pagina Collega include JavaScript utilizzato per eseguire chiamate AJAX ai domini di Identity.

Passo 2: selezionare un provider di identità SAML

L'utente seleziona il SAML IdP esterno che desidera utilizzare per l'autenticazione dalla pagina di accesso personalizzata visualizzata. La pagina di accesso personalizzata deve creare e quindi sottomettere le informazioni necessarie per il file IdP selezionato come file FORM POST HTML all'endpoint /sso/v1/sdk/idp. Per questo passo è necessario includere i seguenti attributi:
  • requestState: ricevuto nella risposta del passo 1
  • Nome idpName: del IdP ricevuto nella risposta del passo 1
  • Tipo idpType: di IdP ricevuto nella risposta del passo 1 (in questo esempio, è SAML)
  • ID idpId: del IdP ricevuto nella risposta del passo 1
  • Nome appName: dell'applicazione a cui il client desidera accedere
  • ID client clientID: dell'applicazione a cui il browser sta tentando di accedere
  • Parametro authorization: richiesto per IDP sicuro

Codice POST form HTML di esempio per selezionare un SAML IdP

L'esempio JavaScript riportato di seguito mostra come selezionare il SAML IdP.
var addParamValues = function(myform, value, paramName) {
    if (value !== null && value !== 'undefined') {
        param = document.createElement("input");
        param.value = value;
        param.name = paramName;
        myform.appendChild(param);
    }
};
 
var chooseRemoteIDP = function(name, idpId, type) {
    var myform = document.createElement("form");
    myform.action = GlobalConfig.idcsBaseURL + "/sso/v1/sdk/secure/idp";
    myform.method = "post";
    <%
        Credentials creds = CredentialsList.getCredentials().get(attr);
        String clientId = creds.getId();
    %>
    var clientId = '<%=clientId%>';
    addParamValues(myform, name, "idpName");
    addParamValues(myform, type, "idpType");
    addParamValues(myform, idpId, "idpId");
    addParamValues(myform, clientId, "clientId");
    addParamValues(myform, authorization, "accesstoken")
    addParamValues(myform, GlobalConfig.requestState, "requestState");
    document.body.appendChild(myform);
    myform.submit();
};
 
var activateIdp = function(name, idpId) {
    chooseRemoteIDP(name, idpId, "SAML");
};
 
var activateSocialIdp = function(name, idpId) {         
    chooseRemoteIDP(name, idpId, "SOCIAL");
};

Esempio di richiesta

Di seguito è riportato un esempio del contenuto di FORM POST nell'endpoint /sso/v1/sdk/secure/idp.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato 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

I domini di Identity elaborano la richiesta e reindirizzano il browser all'indirizzo IdP esterno selezionato per l'autenticazione e l'autorizzazione. Al termine dell'operazione IdP esterna, il browser viene reindirizzato ai domini di Identity. I domini di Identity convalidano la risposta all'asserzione e controllano se è necessaria un'autenticazione aggiuntiva, ad esempio MFA.

Se non è richiesta un'autenticazione aggiuntiva, i domini di Identity creano la sessione e reindirizzano il browser all'URL di destinazione. In alternativa, i domini di Identity creano una sottomissione automatica HTML FORM POST nella pagina di accesso personalizzata che contiene authnToken. La pagina di accesso personalizzata crea quindi la sessione. Vedere Creazione di una sessione.

Autenticazione con un provider Social Identity

In questo caso d'uso vengono illustrati i passi per utilizzare i domini di Identity per l'autenticazione mediante un provider Social Identity (IdP), ad esempio Facebook o Google.

Nota

  • Utilizzare questa interfaccia API di autenticazione solo se si sta creando la propria esperienza di login end-to-end sviluppando un'applicazione di collegamento personalizzata che deve essere utilizzata dai domini di Identity.
  • Questa interfaccia API di autenticazione non può essere utilizzata per integrare le applicazioni con i domini di Identity ai fini del Single Sign-On.
Suggerimento

Scaricare la raccolta di esempi di casi d'uso di autenticazione dei domini di Identity e il file delle variabili globali dalla cartella idcs-authn-api-rest-clients all'interno del repository idm-samples GitHub, quindi importarli in Postman.
Per il caso d'uso, attenersi alla procedura riportata di seguito. Ogni passo contiene esempi di richieste e risposte:

Passo 1: avviare il flusso di autenticazione

Un utente apre una finestra del browser per accedere a una pagina protetta.

In background, la richiesta di autenticazione viene intercettata dai domini di Identity e reindirizzata all'endpoint /authorize. Questo avvia il processo di autenticazione. Anziché presentare la pagina di accesso predefinita, i domini di Identity rispondono creando e sottomettendo al browser un modulo HTML contenente i parametri loginCtx e signature.
Nota

È necessario esporre un endpoint per ricevere l'invio del modulo e leggere i due valori dei parametri.

Esempio di form HTML POST

Di seguito è riportato un esempio di POST form HTML restituito dai domini di Identity per richiamare la pagina di accesso personalizzata.

<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>
Il browser riceve il codice HTML che contiene JavaScript per inviare automaticamente il modulo alla pagina di accesso personalizzata. Poiché il parametro loginCtx è cifrato con based64, l'applicazione di accesso personalizzata deve decifrare loginCtx effettuando le operazioni riportate di seguito.
  • Decodificare utilizzando un decoder base64 per ottenere i dati binari cifrati
  • Utilizzare il nome del tenant e generare una chiave per la decifrazione
  • Decifrare i dati utilizzando i dati chiave e binari

Esempio di logica di decifrazione per loginCtx cifrato in Java

Di seguito è riportata una logica di decifrazione di esempio.

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;
    }

Esempio di risposta

La risposta deve essere simile all'esempio seguente:

{
  "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"
    ]
  }
}
Il parametro loginCtx contiene alcuni attributi importanti:
  • requestState: lo stato del processo di autenticazione. Deve essere utilizzato nei POST e nei GET futuri per gli endpoint API di autenticazione dei domini di Identity.
  • nextOp: l'operazione successiva che l'applicazione di accesso personalizzata deve eseguire.
  • nextAuthFactors: i possibili fattori di autenticazione che la pagina di accesso deve presentare.

I valori di questi attributi definiscono il fattore di autenticazione, i provider di identità e i provider social visualizzati nella pagina di accesso. Viene visualizzata la pagina di accesso contenente i valori decifrati del parametro loginCtx insieme al token di accesso. La pagina Collega include JavaScript utilizzato per eseguire chiamate AJAX ai domini di Identity.

Passo 2: selezionare un provider Social Identity

L'utente seleziona il social IdP che desidera utilizzare per l'autenticazione dalla pagina di accesso personalizzata visualizzata. La pagina di accesso personalizzata deve creare e quindi sottomettere le informazioni necessarie per il file IdP selezionato come file FORM POST HTML all'endpoint /sso/v1/sdk/idp. Per questo passo è necessario includere i seguenti attributi:
  • requestState: ricevuto nella risposta del passo 1
  • Nome idpName: del IdP ricevuto nella risposta del passo 1
  • Tipo idpType: di IdP ricevuto nella risposta del passo 1 (in questo esempio, è Social)
  • ID idpId: del IdP ricevuto nella risposta del passo 1
  • Nome appName: dell'applicazione a cui il client desidera accedere
  • ID client clientID: dell'applicazione a cui il browser sta tentando di accedere
  • Parametro authorization: richiesto per IDP sicuro

Codice POST form HTML di esempio per selezionare un social IdP

L'esempio JavaScript riportato di seguito mostra come selezionare il 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");
};

Esempio di richiesta

Di seguito è riportato un esempio del contenuto di FORM POST nell'endpoint /sso/v1/sdk/secure/idp.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato 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

I domini di Identity elaborano la richiesta e reindirizzano il browser al social IdP selezionato per l'autenticazione e l'autorizzazione. Al termine del social IdP, il browser viene reindirizzato ai domini di Identity. I domini di Identity convalidano la risposta all'asserzione e controllano se è necessaria un'autenticazione aggiuntiva, ad esempio MFA.

Se non è richiesta un'autenticazione aggiuntiva, i domini di Identity creano la sessione e reindirizzano il browser all'URL di destinazione. In alternativa, i domini di Identity creano una sottomissione automatica HTML FORM POST nella pagina di accesso personalizzata che contiene authnToken. La pagina di accesso personalizzata crea quindi la sessione. Vedere Creazione di una sessione.

Autenticazione con un provider di identità SAML e un MFA esterni

In questo caso d'uso vengono illustrati i passi per utilizzare i domini di Identity per l'autenticazione mediante un provider di identità SAML esterno (IdP) e un'autenticazione con più fattori (MFA).

Nota

  • Utilizzare questa interfaccia API di autenticazione solo se si sta creando la propria esperienza di login end-to-end sviluppando un'applicazione di collegamento personalizzata che deve essere utilizzata dai domini di Identity.
  • Questa interfaccia API di autenticazione non può essere utilizzata per integrare le applicazioni con i domini di Identity ai fini del Single Sign-On.
Suggerimento

Scaricare la raccolta di esempi di casi d'uso di autenticazione dei domini di Identity e il file delle variabili globali dalla cartella idcs-authn-api-rest-clients all'interno del repository idm-samples GitHub, quindi importarli in Postman.
Per il caso d'uso, attenersi alla procedura riportata di seguito. Ogni passo contiene esempi di richieste e risposte:

Passo 1: avviare il flusso di autenticazione

Un utente apre una finestra del browser per accedere a una pagina protetta.

In background, la richiesta di autenticazione viene intercettata dai domini di Identity e reindirizzata all'endpoint /authorize. Questo avvia il processo di autenticazione. Anziché presentare la pagina di accesso predefinita, i domini di Identity rispondono creando e sottomettendo al browser un modulo HTML contenente i parametri loginCtx e signature.
Nota

È necessario esporre un endpoint per ricevere l'invio del modulo e leggere i due valori dei parametri.

Esempio di form HTML POST

Di seguito è riportato un esempio di POST form HTML restituito dai domini di Identity per richiamare la pagina di accesso personalizzata.

<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>
Il browser riceve il codice HTML che contiene JavaScript per inviare automaticamente il modulo alla pagina di accesso personalizzata. Poiché il parametro loginCtx è cifrato con based64, l'applicazione di accesso personalizzata deve decifrare loginCtx effettuando le operazioni riportate di seguito.
  • Decodificare utilizzando un decoder base64 per ottenere i dati binari cifrati
  • Utilizzare il nome del tenant e generare una chiave per la decifrazione
  • Decifrare i dati utilizzando i dati chiave e binari

Esempio di logica di decifrazione per loginCtx cifrato in Java

Di seguito è riportata una logica di decifrazione di esempio.

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;   
       }

Esempio di risposta

La risposta deve essere simile all'esempio seguente:

{
  "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"
    ]
  }
}
Il parametro loginCtx contiene alcuni attributi importanti:
  • requestState: lo stato del processo di autenticazione. Deve essere utilizzato nei POST e nei GET futuri per gli endpoint API di autenticazione dei domini di Identity.
  • nextOp: l'operazione successiva che l'applicazione di accesso personalizzata deve eseguire.
  • nextAuthFactors: i possibili fattori di autenticazione che la pagina di accesso deve presentare.

I valori di questi attributi definiscono il fattore di autenticazione, i provider di identità e i provider social visualizzati nella pagina di accesso. Viene visualizzata la pagina di accesso contenente i valori decifrati del parametro loginCtx insieme al token di accesso. La pagina Collega include JavaScript utilizzato per eseguire chiamate AJAX ai domini di Identity.

Passo 2: selezionare un provider di identità esterno

L'utente seleziona il IdP esterno che desidera utilizzare per l'autenticazione dalla pagina di accesso personalizzata visualizzata. La pagina di accesso personalizzata deve creare e quindi sottomettere le informazioni necessarie per il file IdP selezionato come file FORM POST HTML all'endpoint /sso/v1/sdk/idp. Per questo passo è necessario includere i seguenti attributi:
  • requestState: ricevuto nella risposta del passo 1
  • Nome idpName: del IdP ricevuto nella risposta del passo 1
  • Tipo idpType: di IdP ricevuto nella risposta del passo 1 (in questo esempio, è SAML)
  • ID idpId: del IdP ricevuto nella risposta del passo 1
  • Nome appName: dell'applicazione a cui il client desidera accedere
  • ID client clientID: dell'applicazione a cui il browser sta tentando di accedere
  • Parametro authorization: richiesto per IDP sicuro

Codice POST form HTML di esempio per selezionare un IdP esterno

L'esempio JavaScript riportato di seguito mostra come selezionare un IdP esterno.
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");
};

Esempio di richiesta

Di seguito è riportato un esempio del contenuto di FORM POST nell'endpoint /sso/v1/sdk/secure/idp.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato 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

I domini di Identity elaborano la richiesta e reindirizzano il browser all'indirizzo IdP esterno selezionato per l'autenticazione e l'autorizzazione. Al termine della funzione IdP esterna, il browser viene reindirizzato ai domini di Identity, che vengono quindi reindirizzati al browser per avviare la verifica a 2 fasi.

Passo 3: autenticarsi utilizzando il fattore preferito (SMS)

I passi iniziali per avviare la verifica a 2 fasi sono simili al passo 1. I domini di Identity creano e sottomettono un modulo HTML contenente i parametri loginCtx e signature cifrati. Vedere il Passo 1 per informazioni dettagliate sul modulo POST e su come decifrare.

Dopo la decifrazione del parametro loginCtx, la risposta deve essere simile all'esempio seguente:

{
    "status": "success",
    "displayName": "Joe's iPhone",
    "nextAuthFactors": [
        "SMS"
    ],
    "SMS": {
        "credentials": [
            "otpCode"
        ]
    },
    "nextOp": [
        "credSubmit",
        "getBackupFactors",
        "resendCode"
    ],
    "requestState": "QjyV3ueFrGQCO.....84gQw2UUm2V7s",
    "trustedDeviceSettings": {
        "trustDurationInDays": 15
    }
}
Il parametro loginCtx contiene alcuni attributi importanti:
  • requestState: lo stato del processo di autenticazione. Deve essere utilizzato nei POST e nei GET futuri per gli endpoint API di autenticazione dei domini di Identity.
  • nextOp: l'operazione successiva che l'applicazione di accesso personalizzata deve eseguire.
  • nextAuthFactors: i possibili fattori di autenticazione che la pagina di accesso deve presentare.

I valori di questi attributi definiscono il fattore di autenticazione (in questo esempio si tratta di SMS) da presentare nella pagina di accesso. L'utente immette il passcode monouso ricevuto sul dispositivo.

Nella richiesta devono essere inviati i seguenti attributi:
  • op: indica al server il tipo di operazione che il client desidera
  • otpCode: il codice inviato al dispositivo dell'utente
  • requestState: ricevuto nella risposta del passo 2

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON per completare l'autenticazione utilizzando il metodo preferito:

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

È quindi necessario creare una sessione. Dopo la creazione della sessione, il browser viene reindirizzato all'URL richiesto in origine. Vedere Creazione di una sessione.

Creazione di una sessione

Questo caso d'uso fornisce un esempio di utilizzo dei domini di Identity per creare una sessione dopo l'autenticazione, ad esempio dopo l'autenticazione mediante MFA.

Nota

Utilizzare questa interfaccia API di autenticazione solo se si sta creando un'esperienza di login end-to-end personalizzata sviluppando un'applicazione di accesso personalizzata che deve essere utilizzata dai domini di Identity.
Nota

Questa interfaccia API di autenticazione non può essere utilizzata per integrare le applicazioni con i domini di Identity ai fini del Single Sign-On.
Nota

Per informazioni sull'uso dell'interfaccia API di autenticazione, vedere gli altri casi d'uso in Uso dell'interfaccia API di autenticazione.

Inviare authnToken e requestState come FORM POST quando il client viene completato con autenticazione e MFA e deve creare una sessione. Per questo passo, createSession deve essere elencato come valore di attributo nextOp nell'ultima risposta ricevuta e FORM POST deve includere uno dei seguenti attributi.

Per l'endpoint /sso/v1/sdk/secure/session:
  • requestState: ricevuto nell'ultima risposta

    oppure

  • authnToken: ricevuto nell'ultima risposta

    E

  • Parametro authorization: richiesto per la sessione sicura

Esempio di richiesta

Di seguito è riportato un esempio del contenuto di FORM POST nell'endpoint /sso/v1/sdk/secure/session.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato 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

Se createSession non è elencato come valore per il parametro nextOp nell'ultima risposta ricevuta, potrebbe essere necessario creare un token prima di creare una sessione. Se createSession è elencato come valore per nextOp, l'endpoint sdk/session può essere richiamato direttamente utilizzando solo il requestState.

Esempio di richiesta

L'esempio riportato di seguito mostra la richiesta di token all'endpoint /sso/v1/sdk/authenticate in formato JSON.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Il server controlla che non siano necessari altri fattori di valutazione. Se non è richiesta un'altra valutazione, il token viene inviato nella risposta.

Autenticazione con nome utente e password

Questo caso d'uso fornisce un esempio dettagliato dell'uso dell'API di autenticazione dei domini di Identity per l'autenticazione con le credenziali di un utente.

Nota

  • Utilizzare questa interfaccia API di autenticazione solo se si sta creando la propria esperienza di login end-to-end sviluppando un'applicazione di collegamento personalizzata che deve essere utilizzata dai domini di Identity.
  • Questa interfaccia API di autenticazione non può essere utilizzata per integrare le applicazioni con i domini di Identity ai fini del Single Sign-On.
Suggerimento

Scaricare la raccolta di esempi di casi d'uso di autenticazione dei domini di Identity e il file delle variabili globali dalla cartella idcs-authn-api-rest-clients all'interno del repository idm-samples GitHub, quindi importarli in Postman.

Per il caso d'uso, attenersi alla procedura riportata di seguito.

Passo 1: avviare il flusso di autenticazione

Ottenere il file requestState iniziale per avviare il flusso di autenticazione.

Esempio di richiesta

L'esempio seguente mostra la richiesta in formato cURL:

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

Il valore appName è facoltativo. appName è il nome dell'applicazione a cui il client desidera accedere. Se viene fornito un appName, vengono elaborati i criteri di accesso specifici dell'applicazione e viene richiesto al client di individuare i fattori richiesti in base a tale criterio.

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Nella risposta, il valore nextOp indica il valore che può essere inviato come valore op nella richiesta successiva. In questo esempio di caso d'uso, è necessario inviare credSubmit nel passo successivo. Il file requestState contiene i dati contestuali necessari per elaborare la richiesta.

Passo 2: Invia le credenziali dell'utente

Sottomettere le credenziali dell'utente come primo fattore, ovvero il nome utente e la password. Per questa fase, il client deve includere i seguenti attributi:

  • credentials: nome utente e password

  • requestState: ricevuto nella risposta del passo 1

  • op: indica al server il tipo di operazione che il client desidera

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Esempio di risposta di errore

L'esempio seguente mostra il contenuto della risposta in formato JSON quando il nome utente o la password forniti non sono validi:

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

Autenticazione del nome utente e della password con il consenso fascia temporale di utilizzo

Questo caso d'uso fornisce un esempio dettagliato dell'utilizzo dell'API di autenticazione dei domini di Identity per l'autenticazione con le credenziali di un utente con il consenso fascia temporale di utilizzo. Quando l'utente accetta il consenso, viene reindirizzato alla pagina dell'applicazione.

Nota

  • Utilizzare questa interfaccia API di autenticazione solo se si sta creando la propria esperienza di login end-to-end sviluppando un'applicazione di collegamento personalizzata che deve essere utilizzata dai domini di Identity.
  • Questa interfaccia API di autenticazione non può essere utilizzata per integrare le applicazioni con i domini di Identity ai fini del Single Sign-On.
Suggerimento

Scaricare la raccolta di esempi di casi d'uso di autenticazione dei domini di Identity e il file delle variabili globali dalla cartella idcs-authn-api-rest-clients all'interno del repository idm-samples GitHub, quindi importarli in Postman.

Passo 1: avviare il flusso di autenticazione

Ottenere il file requestState iniziale per avviare il flusso di autenticazione.

Esempio di richiesta

L'esempio seguente mostra la richiesta in formato cURL:

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

Il valore appName è facoltativo. appName è il nome dell'applicazione a cui il client desidera accedere. Se viene fornito un appName, vengono elaborati i criteri di accesso specifici dell'applicazione e viene richiesto al client di individuare i fattori richiesti in base a tale criterio.

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Nella risposta, il valore nextOp indica il valore che può essere inviato come valore op nella richiesta successiva. In questo esempio di caso d'uso, è necessario inviare credSubmit nel passo successivo. Il file requestState contiene i dati contestuali necessari per elaborare la richiesta.

Passo 2: Invia le credenziali dell'utente senza MFA)

Sottomettere le credenziali dell'utente come primo fattore, ovvero il nome utente e la password. Per questa fase, il client deve includere i seguenti attributi:
  • credentials: nome utente e password

  • requestState: ricevuto nella risposta del passo 1

  • op: indica al server il tipo di operazione che il client desidera

Se il nome utente e le password sono validi, il server risponde con l'istruzione TOU nelle impostazioni nazionali specificate nel profilo dell'utente. Il server richiede inoltre all'utente di fornire le credenziali di consenso nella richiesta successiva. Se l'istruzione TOU non è presente nelle impostazioni nazionali dell'utente fr, viene visualizzata la risposta 401 con il messaggio di errore AUTH-3036: la dichiarazione delle condizioni d'uso per le impostazioni nazionali fr.

Esempio di richiesta

L'esempio riportato di seguito mostra il contenuto della richiesta POST in formato JSON nell'endpoint /sso/v1/sdk/authenticate.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON quando vengono aggiunte le impostazioni nazionali dell'utente:

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

Esempio di risposta di errore

L'esempio seguente mostra il contenuto della risposta in formato JSON quando non viene aggiunta la fascia temporale di utilizzo per le impostazioni nazionali dell'utente:

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

Passo 3: fornire il consenso fascia temporale di utilizzo

In questo scenario, l'utente accetta o rifiuta le Condizioni d'uso per l'applicazione. Se l'utente accetta le Condizioni d'uso, viene reindirizzato alla pagina dell'applicazione.

Se l'utente rifiuta le condizioni d'uso, viene visualizzata la risposta 401 con il messaggio di errore AUTH-3035: è necessario accettare le condizioni d'uso per accedere a questa applicazione.

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta in formato JSON quando l'utente accetta la fascia temporale di utilizzo.

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

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta in formato JSON quando l'utente rifiuta la fascia temporale di utilizzo.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON quando l'utente accetta l'istruzione TOU.

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

Esempio di risposta di errore

Di seguito viene mostrato il contenuto della risposta in formato JSON quando la fascia temporale di utilizzo viene rifiutata dall'utente.


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

Autenticazione con nome utente e password e MFA e restituzione di un OTP

Questo caso d'uso fornisce un esempio dettagliato dell'uso dell'API REST dei domini di Identity per eseguire l'autenticazione con le credenziali di un utente e l'autenticazione con più fattori (MFA) e per restituire un OTP cifrato nella risposta.

Nota

Utilizzare questa interfaccia API di autenticazione solo se si sta creando la propria esperienza di login end-to-end sviluppando un'applicazione di collegamento personalizzata che deve essere utilizzata dai domini di Identity. Questa interfaccia API di autenticazione non può essere utilizzata per integrare le applicazioni con i domini di Identity ai fini del Single Sign-On.

Scaricare la raccolta di esempi di casi d'uso di autenticazione dei domini di Identity e il file delle variabili globali dalla cartella idcs-authn-api-rest-clients all'interno del repository idm-samples GitHub, quindi importarli in Postman.

I domini di Identity possono essere configurati per inviare un passcode monouso (OTP) basato sul tempo direttamente a un utente per l'autenticazione o per fare in modo che il passcode sia cifrato e inviato al client di consumo che può quindi inviarlo all'utente per l'autenticazione.

Gli amministratori, ad esempio, possono configurare i domini di Identity in modo che inviino passcode monouso (OTP) basati sul tempo all'applicazione Oracle Mobile Authenticator (OMA) o inviino gli OTP all'indirizzo di posta elettronica principale dell'utente. In entrambi i casi, i domini di Identity generano l'OTP, lo inviano direttamente all'utente e l'utente immette il codice per l'autenticazione. Per informazioni su come impostare queste opzioni mediante REST, vedere Iscrizione fattore di autenticazione con verifica fattore - SMS e Iscrizione fattore di autenticazione con e-mail di verifica fattore.

In alternativa, gli amministratori possono configurare i domini di Identity in modo che restituiscano un OTP cifrato nella risposta API al client di consumo in modo che il client di consumo possa avviare o inviare l'OTP all'utente. Due vantaggi di questo approccio sono che permette al cliente consumatore di personalizzare il messaggio di autenticazione e anche di modificare i dettagli del mittente per soddisfare le loro esigenze aziendali. Per configurare i domini di Identity in modo che restituiscano l'OTP cifrato nella risposta, il client di consumo deve completare i passi riportati di seguito.
  1. Passo 1: Creazione di un'applicazione CustomUI

  2. Passo 2: generare una coppia di chiavi per un certificato con firma automatica

  3. Passo 3: configurare l'applicazione per restituire l'OTP nella risposta

  4. Passo 4: richiedere l'OTP

Nota

Questi passi presuppongono che l'autenticazione MFA sia abilitata e che venga creato un criterio di accesso per l'autenticazione MFA. Vedere Configurazione delle impostazioni di autenticazione con più fattori.

Cifratura e decifrazione

Questa implementazione utilizza la seguente specifica per cifrare e decifrare il codice OTP ricevuto. Vedere PKCS #1: RSA Cryptography Specifications, Versione 2.0, sezione 7.1 RSAES-OAEP.

Codice decifrazione OTP

Utilizzare il seguente codice Java per decifrare l'OTP.
/*
 * 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();
            }
    }
    
}

Passo 1: Creazione di un'applicazione CustomUI

Per ulteriori informazioni sulle applicazioni personalizzate, vedere Aggiungi applicazioni.

Passo 2: generare una coppia di chiavi per un certificato con firma automatica

Per ricevere l'OTP nella risposta, il client di consumo deve generare una coppia di chiavi privata/pubblica, quindi generare un certificato con firma automatica e importare tale certificato nell'applicazione CustomUI.
  • Verificare che il file di configurazione otp-client.conf contenga le seguenti informazioni. Quindi, generare una coppia di chiavi privata e pubblica.
    [ 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"
    
  • Utilizzare il comando seguente per generare un certificato autofirmato.
    #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
    

Passo 3: configurare l'applicazione per restituire l'OTP nella risposta

Dopo aver generato il certificato con firma automatica, è necessario importarlo nell'applicazione CustomUI.
  1. Nella console di Identity Cloud Service espandere il cassetto di navigazione, selezionare Applicazioni, CustomUI applicazione, Configurazione e quindi Configurazione client.
  2. Importare il certificato con firma automatica nel certificato client sicuro e salvare la configurazione.

Passo 4: richiedere l'OTP

Payload richieste
Attributo Valori supportati/Valori di esempio A più valori Dettagli d'uso
userFlowControlledByExternalClient true / falso false
Impostare questa opzione su
true
e l'OTP verrà restituito nella risposta nel formato cifrato specificato.

Nota: il certificato utilizzato per la cifratura viene caricato nell'applicazione in anticipo e viene fatto riferimento utilizzando l'attributo x5t nell'esempio di richiesta, come indicato di seguito.

x5t Stringa / X509 SHA-1 Certificato Thumbprint

Quando specificato, il servizio utilizza questo certificato caricato per cifrare i dati OTP.

Nota: l'attributo "x5t" deve corrispondere al certificato caricato.

Esempio di richiesta
{
   "op": "credSubmit",
   "credentials": {
      "username": "test.user",
      "password": "example-password"
   },
   "userFlowControlledByExternalClient": true,
   "x5t": "<certificate thumbprint>",
   "requestState": "{{requestState}}"
}
Payload risposte
Attributo Valori supportati/Valori di esempio A più valori Dettagli d'uso
otp

Mappa

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

Se presente nella risposta, l'attributo contiene l'OTP cifrato con i dettagli riportati di seguito.

  • valore: valore cifrato.
  • alg: algoritmo utilizzato per la cifratura.
  • x5t: Thumbprint SHA-1 X509 del certificato utilizzato per la cifratura.

Esempio di risposta

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

Generazione del token di accesso mediante l'API di autenticazione

Questo caso d'uso fornisce un esempio dettagliato dell'uso dei domini di Identity per generare il token di accesso utilizzando l'API di autenticazione. L'utente ottiene le informazioni utente tramite il token di accesso utente mediante l'API di autenticazione.

Nota

  • Utilizzare questa interfaccia API di autenticazione solo se si sta creando la propria esperienza di login end-to-end sviluppando un'applicazione di collegamento personalizzata che deve essere utilizzata dai domini di Identity.
  • Questa interfaccia API di autenticazione non può essere utilizzata per integrare le applicazioni con i domini di Identity ai fini del Single Sign-On.
Suggerimento

Scaricare la raccolta di esempi di casi d'uso di autenticazione dei domini di Identity e il file delle variabili globali dalla cartella idcs-authn-api-rest-clients all'interno del repository idm-samples GitHub, quindi importarli in Postman.

Quando l'utente tenta di accedere a un'applicazione associata alla fascia temporale di utilizzo, il server dei domini di Identity utilizza il nome dell'applicazione per recuperare il criterio assegnato a questa applicazione. In base alle impostazioni del tenant, il server ottiene il provider di identità e il criterio di autenticazione e quindi guida l'utente al passo successivo.

Passo 1: avviare il flusso di autenticazione

Ottenere il file requestState iniziale per avviare il flusso di autenticazione.

Esempio di richiesta

L'esempio seguente mostra la richiesta in formato cURL:

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

Il valore appName è facoltativo. appName è il nome dell'applicazione a cui il client desidera accedere. Se viene fornito un appName, vengono elaborati i criteri di accesso specifici dell'applicazione e viene richiesto al client di individuare i fattori richiesti in base a tale criterio.

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Nella risposta, il valore nextOp indica il valore che può essere inviato come valore op nella richiesta successiva. In questo esempio di caso d'uso, è necessario inviare credSubmit nel passo successivo. Il file requestState contiene i dati contestuali necessari per elaborare la richiesta.

Passo 2: Invia le credenziali dell'utente

In questo scenario, l'utente pubblica le credenziali utente e recupera authnToken. Nella richiesta devono essere inclusi i seguenti elementi:
  • credentials: nome utente e password

  • requestState: ricevuto nella risposta del passo 1

  • op: indica al server il tipo di operazione che il client desidera

AuthnToken è il file id_token in formato JWT che rappresenta le informazioni sull'utente corrente, la sessione e i dati della richiesta. Viene utilizzato per creare un cookie di sessione SSO e reindirizzare all'URL di destinazione. Se il nome utente e la password sono validi, viene recuperato AuthnToken.

Esempio di richiesta

L'esempio riportato di seguito mostra il contenuto della richiesta POST in formato JSON nell'endpoint /sso/v1/sdk/authenticate.

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

Esempio di risposta

L'esempio riportato di seguito mostra il contenuto della risposta in formato JSON in cui viene recuperato AuthnToken.

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

Passo 3: Genera token di accesso

Dopo aver recuperato un AuthnToken, viene utilizzato per ottenere il token di accesso dal server OAuth.

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta in formato JSON.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Passo 4: ottenere informazioni utente

L'utente sottomette il token di accesso per ottenere informazioni quali nome utente, nome visualizzato, ID e-mail e così via.

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta in formato JSON.

{{HOST}}/admin/v1/Me

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON con le informazioni utente.

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

Autenticazione con nome utente e password e MFA

Questo caso d'uso fornisce un esempio dettagliato dell'uso dell'API REST dei domini di Identity per l'autenticazione con le credenziali di un utente e l'autenticazione con più fattori (MFA).

Nota

  • Utilizzare questa interfaccia API di autenticazione solo se si sta creando la propria esperienza di login end-to-end sviluppando un'applicazione di collegamento personalizzata che deve essere utilizzata dai domini di Identity.
  • Questa interfaccia API di autenticazione non può essere utilizzata per integrare le applicazioni con i domini di Identity ai fini del Single Sign-On.
Suggerimento

Scaricare la raccolta di esempi di casi d'uso di autenticazione dei domini di Identity e il file delle variabili globali dalla cartella idcs-authn-api-rest-clients all'interno del repository idm-samples GitHub, quindi importarli in Postman.

Per questo caso d'uso, attenersi alla procedura riportata di seguito.

Nota

Questi passi presuppongono che l'autenticazione MFA sia abilitata e che venga creato un criterio di accesso per l'autenticazione MFA. Vedere Configurazione delle impostazioni di autenticazione con più fattori.

Passo 1: avviare il flusso di autenticazione

Ottenere il file requestState iniziale per avviare il flusso di autenticazione.

Esempio di richiesta

L'esempio seguente mostra la richiesta in formato cURL:

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

Il valore appName è facoltativo. appName è il nome dell'applicazione a cui il client desidera accedere. Se viene fornito un appName, vengono elaborati i criteri di accesso specifici dell'applicazione e viene richiesto al client di individuare i fattori richiesti in base a tale criterio.

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Nella risposta, il valore nextOp indica il valore che può essere inviato come valore op nella richiesta successiva. In questo esempio di caso d'uso, è necessario inviare credSubmit nel passo successivo. Il file requestState contiene i dati contestuali necessari per elaborare la richiesta.

Passo 2: Invia le credenziali dell'utente

Sottomettere le credenziali dell'utente come primo fattore, ovvero il nome utente e la password. Per questa fase, il client deve includere i seguenti attributi:

  • credentials: nome utente e password

  • requestState: ricevuto nella risposta del passo 1

  • op: indica al server il tipo di operazione che il client desidera

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON poiché le notifiche PUSH sono il fattore preferito:

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

Se l'impostazione Dispositivo sicuro è disabilitata a livello di tenant, l'attributo {{trustedDeviceSettings}} non viene restituito nella risposta.

Se l'impostazione Dispositivo sicuro è abilitata a livello di tenant e se la regola della regola di accesso corrispondente ha Frequenza MFA = Ogni volta, viene restituito il campo {{trustedDeviceSettings}}, ma il valore {{trustDurationInDays}} viene restituito come 0.
"trustedDeviceSettings": {
       "trustDurationInDays": 0
 }

Nella risposta, lo stato è pending poiché l'utente deve consentire o negare la notifica PUSH sul proprio dispositivo. I valori nextOp nella risposta indicano gli elementi che possono essere inviati come valore op nella richiesta successiva. In questo esempio di caso d'uso, nel passo successivo viene inviato credSubmit.

Passo 3: autenticarsi utilizzando il fattore preferito

Eseguire l'autenticazione utilizzando il fattore preferito, che in questo esempio di caso d'uso è Notifiche PUSH. Il client deve includere i seguenti attributi nella richiesta:

  • op: indica al server il tipo di operazione che il client desidera

  • requestState: ricevuto nella risposta del passo 2

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON per completare l'autenticazione utilizzando il metodo preferito:

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Autenticazione con nome utente e password e iscrizione a MFA

Questo caso d'uso fornisce un esempio dettagliato dell'utilizzo dell'API di autenticazione dei domini di Identity per eseguire l'autenticazione con le credenziali di un utente e quindi iscriversi all'autenticazione a più fattori (MFA).

Nota

  • Utilizzare questa interfaccia API di autenticazione solo se si sta creando la propria esperienza di login end-to-end sviluppando un'applicazione di collegamento personalizzata che deve essere utilizzata dai domini di Identity.
  • Questa interfaccia API di autenticazione non può essere utilizzata per integrare le applicazioni con i domini di Identity ai fini del Single Sign-On.
Suggerimento

Scaricare la raccolta di esempi di casi d'uso di autenticazione dei domini di Identity e il file delle variabili globali dalla cartella idcs-authn-api-rest-clients all'interno del repository idm-samples GitHub, quindi importarli in Postman.
Per il caso d'uso, attenersi alla procedura riportata di seguito. Ogni passo contiene esempi di richieste e risposte:
Nota

Questi passi presuppongono che l'autenticazione MFA sia abilitata e che venga creato un criterio di accesso per l'autenticazione MFA. Vedere Configurazione delle impostazioni di autenticazione con più fattori.

Passo 1: avviare il flusso di autenticazione

Ottenere il file requestState iniziale per avviare il flusso di autenticazione.

Esempio di richiesta

L'esempio seguente mostra la richiesta in formato cURL:

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

Il valore appName è facoltativo. appName è il nome dell'applicazione a cui il client desidera accedere. Se viene fornito un appName, vengono elaborati i criteri di accesso specifici dell'applicazione e viene richiesto al client di individuare i fattori richiesti in base a tale criterio.

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Nella risposta, il valore nextOp indica il valore che può essere inviato come valore op nella richiesta successiva. In questo esempio di caso d'uso, è necessario inviare credSubmit nel passo successivo. Il file requestState contiene i dati contestuali necessari per elaborare la richiesta.

Passo 2: Invia le credenziali dell'utente

Sottomettere le credenziali dell'utente come primo fattore, ovvero il nome utente e la password. Per questa fase, il client deve includere i seguenti attributi:

  • credentials: nome utente e password

  • requestState: ricevuto nella risposta del passo 1

  • op: indica al server il tipo di operazione che il client desidera

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato 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"
}

In questo esempio di caso d'uso, poiché l'autenticazione MFA è impostata come facoltativa nel criterio di accesso (indicato da un valore false per l'attributo enrollmentRequired), all'utente viene data la possibilità di iscriversi o saltare l'iscrizione. Se è richiesto l'autenticazione MFA, l'unico valore nextOp sarebbe enrollment.

In questo esempio di caso d'uso, nel passo successivo viene inviato enrollment per avviare l'iscrizione al fattore MFA per l'utente. BYPASSCODE mancante come valore nextAuthFactors poiché l'utente non può iscriversi utilizzando un codice bypass. Il codice bypass deve essere generato dall'utente utilizzando Profilo personale o richiedendo a un amministratore di generarne uno.

Passo 3: Avvia iscrizione autenticazione secondo fattore

Questo passo avvia l'iscrizione TOTP (Online Time-Based One-Time Passcode). Il client deve includere i seguenti attributi:
  • op: indica al server il tipo di operazione che il client desidera

  • authFactor: definisce il fattore di autenticazione a cui l'utente desidera iscriversi

  • requestState: ricevuto nella risposta del passo 2

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato 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"
}
Nella risposta, i valori nextOp indicano gli elementi che possono essere inviati come valore op nella richiesta successiva. In questo esempio di caso d'uso, nel passo successivo viene inviato credSubmit.
Nota

Il valore di content inizia sempre con oraclemobileauthenticator//.

Passo 4: Sottometti credenziali fattore

Questo passo sottomette le credenziali del fattore nel file requestState ricevute nella risposta del passo 3. Tenere presente che il payload della richiesta non contiene l'attributo authFactor perché requestState lo contiene. Il client deve includere i seguenti attributi:
  • op: indica al server il tipo di operazione che il client desidera

  • requestState: ricevuto nella risposta del passo 3

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON per sottomettere le credenziali del fattore:

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

Esempio di risposta

Lo stato success viene visualizzato nella risposta quando l'applicazione OMA alla comunicazione del canale secondario del server viene completata e la verifica optCode riesce. L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Nella risposta, i valori nextOp indicano gli elementi che possono essere inviati come valore op nella richiesta successiva. In questo esempio di caso d'uso, nel passo successivo viene inviato createToken.

Esempio di risposta in sospeso

Lo stato pending viene visualizzato quando la comunicazione tra l'applicazione OMA e il server nel canale secondario non viene completata. Il client continua a eseguire il polling ogni 10 secondi e continua a eseguire il polling per due minuti. Dopo due minuti, il server invia lo stato di errore se la verifica otpCode non riesce.

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

Passo 5: Creare il token di autenticazione

Questo passo indica che il client viene eseguito con tutti i file authnFactors e richiede la creazione di una sessione. Il server verifica che non sia necessario alcun altro fattore di valutazione (a seconda di quanto definito per il criterio) e risponde con il token o nega l'accesso. Il client deve includere i seguenti attributi:

  • op: indica al server il tipo di operazione che il client desidera

  • requestState: ricevuto nella risposta al passo 4

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON.
{  
   "op":"createToken",
   "requestState":"{{requestState}}"
}

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Autenticazione del nome utente e della password e iscrizione al recupero dell'account

Questo caso d'uso fornisce un esempio dettagliato dell'utilizzo dell'API di autenticazione dei domini di Identity per l'autenticazione con le credenziali di un utente e quindi per la registrazione al recupero dell'account.

Nota

  • Utilizzare questa interfaccia API di autenticazione solo se si sta creando la propria esperienza di login end-to-end sviluppando un'applicazione di collegamento personalizzata che deve essere utilizzata dai domini di Identity.
  • Questa interfaccia API di autenticazione non può essere utilizzata per integrare le applicazioni con i domini di Identity ai fini del Single Sign-On.
Suggerimento

Scaricare la raccolta di esempi di casi d'uso di autenticazione dei domini di Identity e il file delle variabili globali dalla cartella idcs-authn-api-rest-clients all'interno del repository idm-samples GitHub, quindi importarli in Postman.
Nota

Questi passi presuppongono che per il recupero dell'account siano abilitati più fattori, ma la registrazione MFA non è configurata. Vedere Configura recupero account e Configura impostazioni di autenticazione con più fattori.

Passo 1: avviare il flusso di autenticazione

Ottenere il file requestState iniziale per avviare il flusso di autenticazione.

Esempio di richiesta

L'esempio seguente mostra la richiesta in formato cURL:

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

Il valore appName è facoltativo. appName è il nome dell'applicazione a cui il client desidera accedere. Se viene fornito un appName, vengono elaborati i criteri di accesso specifici dell'applicazione e viene richiesto al client di individuare i fattori richiesti in base a tale criterio.

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Nella risposta, il valore nextOp indica il valore che può essere inviato come valore op nella richiesta successiva. In questo esempio di caso d'uso, è necessario inviare credSubmit nel passo successivo. Il file requestState contiene i dati contestuali necessari per elaborare la richiesta.

Passo 2: Invia le credenziali dell'utente

Sottomettere le credenziali dell'utente come primo fattore, ovvero il nome utente e la password. Per questa fase, il client deve includere i seguenti attributi:

  • credentials: nome utente e password

  • requestState: ricevuto nella risposta del passo 1

  • op: indica al server il tipo di operazione che il client desidera

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato 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"
}

In questo esempio di caso d'uso, l'utente deve iscriversi al recupero dell'account (indicato da un valore true per l'attributo accRecEnrollmentRequired:true). nextAuthFactors indica i fattori a cui l'utente può iscriversi per il recupero dell'account.

In questo esempio di caso d'uso, la registrazione viene inviata nel passo successivo per avviare la registrazione per il recupero dell'account per l'utente.

Passo 3: Avvia iscrizione recupero account

Questo passo avvia la registrazione SMS. Il client deve includere i seguenti attributi:

  • op: indica al server il tipo di operazione che il client desidera
  • authFactor: definisce il fattore di autenticazione a cui l'utente desidera iscriversi
  • phoneNumber: definisce il numero di telefono in cui verrà inviato il testo SMS
  • countryCode: definisce il prefisso internazionale del numero di telefono in cui verrà inviato il testo SMS
  • requestState: ricevuto nella risposta del passo 2

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della richiesta in formato JSON.

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

Nella risposta, i valori nextOp indicano cosa può essere inviato come valore op nella richiesta successiva. In questo esempio di caso d'uso, nel passo successivo viene inviato credSubmit. L'indirizzo otpCode viene inviato tramite SMS al dispositivo dell'utente.

Passo 4: Sottometti credenziali fattore

Questo passo sottomette le credenziali del fattore nel file requestState ricevute nella risposta del passo 3. Tenere presente che il payload della richiesta non contiene l'attributo authFactor perché requestState lo contiene. Il client deve includere i seguenti attributi:
  • op: indica al server il tipo di operazione che il client desidera
  • requestState: ricevuto nella risposta del passo 3

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON per sottomettere le credenziali del fattore:

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

Esempio di risposta

Lo stato di operazione riuscita viene visualizzato nella risposta quando la verifica optCode riesce. L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Nella risposta, il valore accRecEnrollmentRequired viene impostato su false poiché l'iscrizione dell'account è riuscita. I valori nextOp indicano gli elementi che possono essere inviati come valore op nella richiesta successiva. Il valore nextOp "iscrizione" consente all'utente di passare a un altro fattore per iscriversi al recupero dell'account. In questo esempio di caso d'uso, nel passo successivo viene inviato createToken .

Passo 5: Creare il token di autenticazione

Questo passo indica che il client è stato eseguito e che è necessaria la creazione di una sessione. Il server verifica che non sia necessario alcun altro fattore di valutazione (a seconda di quanto definito per il criterio) e risponde con il token o nega l'accesso. Il client deve includere i seguenti attributi:
  • op: indica al server il tipo di operazione che il client desidera requestState: ricevuta nella risposta del passo 4
  • requestState: ricevuto nella risposta al passo 4

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Autenticazione di nome utente e password e iscrizione al recupero account e all'autenticazione MFA

Questo caso d'uso fornisce un esempio dettagliato dell'utilizzo dell'API di autenticazione dei domini di Identity per eseguire l'autenticazione con le credenziali di un utente e quindi iscriversi all'autenticazione MFA (Account Recovery and Multifactor Authentication).

Nota

  • Utilizzare questa interfaccia API di autenticazione solo se si sta creando la propria esperienza di login end-to-end sviluppando un'applicazione di collegamento personalizzata che deve essere utilizzata dai domini di Identity.
  • Questa interfaccia API di autenticazione non può essere utilizzata per integrare le applicazioni con i domini di Identity ai fini del Single Sign-On.
Suggerimento

Scaricare la raccolta di esempi di casi d'uso di autenticazione dei domini di Identity e il file delle variabili globali dalla cartella idcs-authn-api-rest-clients all'interno del repository idm-samples GitHub, quindi importarli in Postman.
Nota

Questi passi presuppongono che il recupero dell'account e l'autenticazione MFA siano abilitati e che venga creato un criterio di accesso per l'autenticazione MFA. Vedere Configura recupero account e Configura impostazioni di autenticazione con più fattori.

Passo 1: avviare il flusso di autenticazione

Ottenere il file requestState iniziale per avviare il flusso di autenticazione.

Esempio di richiesta

L'esempio seguente mostra la richiesta in formato cURL:

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

Il valore appName è facoltativo. appName è il nome dell'applicazione a cui il client desidera accedere. Se viene fornito un appName, vengono elaborati i criteri di accesso specifici dell'applicazione e viene richiesto al client di individuare i fattori richiesti in base a tale criterio.

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Nella risposta, il valore nextOp indica il valore che può essere inviato come valore op nella richiesta successiva. In questo esempio di caso d'uso, è necessario inviare credSubmit nel passo successivo. Il file requestState contiene i dati contestuali necessari per elaborare la richiesta.

Passo 2: Invia le credenziali dell'utente

Sottomettere le credenziali dell'utente come primo fattore, ovvero il nome utente e la password. Per questa fase, il client deve includere i seguenti attributi:

  • credentials: nome utente e password

  • requestState: ricevuto nella risposta del passo 1

  • op: indica al server il tipo di operazione che il client desidera

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato 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"
}

In questo esempio di caso d'uso, l'utente deve iscriversi al recupero dell'account (indicato da un valore true per l'attributo accRecEnrollmentRequired:true). nextAuthFactors indica i fattori a cui l'utente può iscriversi per il recupero dell'account.

In questo esempio di caso d'uso, la registrazione viene inviata nel passo successivo per avviare la registrazione per il recupero dell'account per l'utente.

Passo 3: Avvia iscrizione recupero account

Questo passo avvia la registrazione SMS. Il client deve includere i seguenti attributi:

  • op: indica al server il tipo di operazione che il client desidera
  • authFactor: definisce il fattore di autenticazione a cui l'utente desidera iscriversi
  • phoneNumber: definisce il numero di telefono in cui verrà inviato il testo SMS
  • countryCode: definisce il prefisso internazionale del numero di telefono in cui verrà inviato il testo SMS
  • requestState: ricevuto nella risposta del passo 2

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della richiesta in formato JSON.

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

Nella risposta, i valori nextOp indicano cosa può essere inviato come valore op nella richiesta successiva. In questo esempio di caso d'uso, nel passo successivo viene inviato credSubmit. L'indirizzo otpCode viene inviato tramite SMS al dispositivo dell'utente. Le credenziali comunicano all'utente l'input necessario per passare alla richiesta successiva.

Passo 4: Sottometti credenziali fattore

Questo passo sottomette le credenziali del fattore insieme al requestState ricevuto nella risposta del passo 3. Tenere presente che il payload della richiesta non contiene l'attributo authFactor perché requestState lo contiene. Il client deve includere i seguenti attributi:
  • op: indica al server il tipo di operazione che il client desidera
  • requestState: ricevuto nella risposta del passo 3

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON per sottomettere le credenziali del fattore:

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

Esempio di risposta

Lo stato di operazione riuscita viene visualizzato nella risposta quando la verifica optCode riesce. L'esempio seguente mostra il contenuto della risposta in formato JSON.

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

Nella risposta, il valore accRecEnrollmentRequired viene impostato su false poiché l'iscrizione dell'account è riuscita. I valori nextOp indicano gli elementi che possono essere inviati come valore op nella richiesta successiva. Il valore nextOp "iscrizione" consente all'utente di passare a un altro fattore per iscriversi al recupero dell'account. In questo esempio di caso d'uso, nel passo successivo viene inviato createToken .

Passo 5: Creare il token di autenticazione

Questo passo indica che il client viene eseguito con la registrazione per il recupero dell'account e richiede la creazione di una sessione. Il server verifica che non sia necessario alcun altro fattore di valutazione (a seconda di quanto definito per il criterio) e risponde con il token o risponde di conseguenza. Il client deve includere i seguenti attributi:
  • op: indica al server il tipo di operazione che il client desidera ricevere requestState nella risposta del passo 4
  • requestState: ricevuto nella risposta al passo 4

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato 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"
}

Nella risposta, poiché è richiesto l'autenticazione MFA, il valore enrollmentRequired è true in mfaSettings. Di conseguenza, non viene emesso alcun token. Il file EnrolledAccountRecoveryFactorsDetails mostra i fattori di recupero dell'account a cui l'utente si è iscritto. I valori nextOp indicano gli elementi che possono essere inviati come valore op nella richiesta successiva. In questo esempio, il valore nextOp "iscrizione" indica che l'utente deve iscriversi all'autenticazione MFA.

Passo 6: impostare SMS come fattore MFA predefinito in sovrapposizione

Questo passo indica che il client deve iscriversi all'autenticazione MFA.

Il client deve includere i seguenti attributi:

  • authFactor: indica il fattore a cui iscriversi per l'autenticazione MFA
  • accountRecoveryFactor: se impostato su true, indica che l'utente desidera riutilizzare il fattore di recupero dell'account già registrato per l'autenticazione MFA.

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON.

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

Esempio di risposta


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

Nella risposta i valori nextOp indicano cosa può essere inviato come valore op nella richiesta successiva. Il valore nextOp "iscrizione" consente all'utente di iscrivere un fattore aggiuntivo per l'autenticazione MFA. In questo esempio di caso d'uso, nel passo successivo viene inviato createToken.

Passo 7: Creare il token di autenticazione

Questo passo indica che il client viene eseguito con tutto il file authnFactors e richiede la creazione di una sessione. A seconda di quanto definito per il criterio, il server verifica che non sia necessaria alcuna valutazione di altri fattori e risponde con il token o nega l'accesso. Il client deve includere i seguenti attributi:
  • op: indica al server il tipo di operazione che il client desidera
  • requestState: ricevuto nella risposta del passo 6

Esempio di richiesta

L'esempio seguente mostra il contenuto della richiesta POST in formato JSON.

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

Esempio di risposta

L'esempio seguente mostra il contenuto della risposta in formato JSON.
{
    "authnToken": "{{authnToken}}",
    "status": "success",
    "ecId": "HI^kd1W0000000000"
}

Autenticazione con nome utente e password e conservazione della connessione

Abilitare e configurare l'opzione Mantieni collegamento (KMSI) in modo che gli utenti possano accedere a un dominio di Identity senza dover eseguire ripetutamente l'accesso.

Per configurare KMSI utilizzando interfacce di applicazione programmatiche, attenersi alla procedura riportata di seguito.

Questo argomento include inoltre le sezioni riportate di seguito.

Informazioni preliminari

Passo 1: abilitare KMSI per un dominio di Identity

Dopo aver abilitato KMSI per l'account cloud, completare i passi riportati di seguito per abilitare KMSI per un dominio di Identity IAM.
Nota

Se si desidera utilizzare l'interfaccia utente per abilitare KMSI, vedere Modifica delle impostazioni della sessione e Creazione di un criterio di accesso.
  1. Ottenere il token di accesso amministratore del dominio di Identity per l'account.
  2. Eseguire GET sull'endpoint /admin/v1/KmsiSettings/KmsiSettings. Il sistema restituisce KmsiSettings.
  3. Aggiornare gli attributi necessari ed eseguire PUT sull'endpoint /admin/v1/KmsiSettings/KmsiSettings.
tokenValidityInDays
Immettere per quanti giorni gli utenti possono rimanere collegati prima di scollegarsi automaticamente.
kmsiEnabled
Indica se il servizio KMSI è abilitato per il dominio di Identity.
maxAllowedSessions
Immettere il numero massimo di sessioni collegate che un utente può avere.

Richiesta di esempio

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

Passo 2: avviare il flusso di autenticazione

Ottenere il file requestState iniziale per avviare il flusso di autenticazione.

Esempio di richiesta

L'esempio seguente mostra la richiesta in formato cURL:

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

Il valore appName è facoltativo. appName è il nome dell'applicazione a cui il client desidera accedere. Se viene fornito un appName, vengono elaborati i criteri di accesso specifici dell'applicazione e viene richiesto al client di individuare i fattori richiesti in base a tale criterio.

Esempio di risposta

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

Prendere nota del nuovo attributo keepMeSignedInEnabled incluso nella risposta. Indica che questo dominio di Identity e questa applicazione supportano il servizio KMSI. Se si dispone di un'interfaccia personalizzata, utilizzare questo attributo per visualizzare l'opzione Mantieni collegamento nella pagina di accesso.

Passo 3: Invia le credenziali dell'utente con KMSI

Richiesta
  • Operazione: POST
  • Endpoint: /sso/v1/sdk/authenticate

Esempio di richiesta
Nota

Prendere nota del nuovo attributo keepMeSignedIn incluso nella richiesta. Questo attributo indica che l'utente desidera utilizzare KMSI.
{
    "op": "credSubmit",
    "credentials": {
        "username": "username",
        "password": "Password"
    },
    "keepMeSignedIn": true,
    "kmsiDeviceDisplayName": "Postman KeepMeSigned In",
    "requestState": "requestState"
}

Se si dispone di un'interfaccia personalizzata, utilizzare questo attributo per visualizzare l'opzione KMSI, selezionare lo stato della casella di controllo (on o off) e inviare questo parametro per creare la sessione KMSI.

Esempio di risposta

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

Nell'esempio di risposta, prendere nota dell'attributo kmsiToken. Questo token può essere utilizzato per accedere a qualsiasi applicazione in futuro senza richiedere a un utente di connettersi di nuovo.

Passo 4: riemettere authnToken dopo la scadenza della sessione

Richiesta
  • Operazione: POST

  • Endpoint: /sso/v1/sdk/authenticate

Esempio di richiesta

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

Esempio di risposta

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

Si noti l'operazione credSubmit con i nuovi authFactor, appName e kmsiToken inviati nella richiesta. SSO valuta la richiesta e restituisce authnToken e l'ultimo kmsiToken aggiornato nella risposta. Si tratta di un kmsiToken aggiornato e sostituisce il token esistente. È necessario includere questo kmsiToken aggiornato nella richiesta successiva.

Passo 5: sottomettere le credenziali utente con il flusso KMSI e MFA

Avviare GET sul /sso/v1/sdk/authenticate dal Passo 2: avvio del flusso di autenticazione.

Richiesta
  • Operazione: POST

  • Endpoint: /sso/v1/sdk/authenticate

Esempio di risposta

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

Esempio di risposta

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

Dopo aver ottenuto il passcode monouso (OTP) sul dispositivo, aggiungere l'OTP nella richiesta.

Esempio di richiesta

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

La risposta include authToken e kmsiToken. Questo è un file kmsiToken aggiornato.

Esempio di risposta

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

Passo 6: riemettere authnToken dopo la scadenza della sessione quando è impostato un fattore MFA

Quando un utente tenta di accedere utilizzando kmsiToken e viene configurato un secondo fattore, all'utente viene sempre richiesta l'autenticazione del secondo fattore. Solo dopo l'autenticazione riuscita, nella risposta verranno inviati authnToken e kmsiToken.

Richiesta
  • Operazione: POST

  • Endpoint: /sso/v1/sdk/authenticate

Esempio di richiesta

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

La risposta contiene un token KMSI e una richiesta di verifica MFA aggiornati.

Esempio di risposta

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

Ripetere lo stesso processo in cui verrà nuovamente richiesto l'OTP sul dispositivo. Fornire il payload riportato di seguito con OTP. La risposta deve includere authnToken.

Esempio di richiesta

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

Esempio di risposta

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

kmsiToken Flusso con requestState

Utilizzare questo flusso per supportare il contesto del browser quando si possiede il token KMSI, ma non il cookie KMSI. Dopo la scadenza della sessione, l'applicazione effettua una chiamata di autorizzazione al sistema di identità con redirectUrl, state, nonce e così via. Nella risposta, il sistema di identità restituisce requestState all'interno di loginCtx. Questo requestState insieme al token KMSI viene passato per reindirizzare l'applicazione richiesta dopo l'estensione della sessione.

Richiesta
  • Operazione: POST

  • Endpoint: /sso/v1/sdk/authenticate

L'API supporta KMSI come authFactor e l'autenticazione KMSI con il parametro requestState. Ciò consente di recuperare kmsiToken con requestState da loginCtx.
Nota

Se requestState e kmsiToken non appartengono alla stessa applicazione, la richiesta viene rifiutata.

Esempio di richiesta

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

Esempio di risposta

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

Modifiche a /sso/v1/sdk/secure/session

KMSI richiede l'aggiunta di un nuovo attributo all'endpoint /sso/v1/sdk/secure/session. kmsiToken deve essere inviato all'endpoint dall'applicazione di login personalizzata.

Esempio di richiesta Esempio di risposta

authnToken o requestState

authorization

kmsiToken
La nuova variabile form post kmsiToken insieme a authnToken o requestState reindirizzerà all'applicazione insieme al cookie di sessione SSO e al cookie KMSI.

Firma payload per chiamate avviate /authorize

  1. Quando un utente accede a qualsiasi applicazione Web protetta dai domini di Identity, immette l'URL dell'applicazione, ad esempio https://example.com/home/pages/profile.
  2. Il sistema esegue il reindirizzamento alla chiamata al dominio di Identity /authorize.
  3. Il dominio di Identity reindirizza l'utente alla pagina di collegamento personalizzato distribuita dal cliente.
  4. L'applicazione di accesso gestita dal cliente raccoglie i parametri di input e decodifica l'input loginCtx.
  5. Il parametro di input decifrato corrisponde alla chiamata GET /sso/v1/sdk/authenticate.
  6. Il payload contiene keepMeSignedInEnabled per identificare se il servizio KMSI è abilitato.
  7. L'applicazione di login personalizzata raccoglie le credenziali e le sottomette al dominio di Identity.
  8. Il dominio di Identity convalida le credenziali e genera i problemi kmsiToken e authnToken.
  9. L'applicazione di login personalizzata utilizza gli endpoint authnToken e kmsiToken durante la chiamata all'endpoint /sso/v1/sdk/secure/session. La nuova sintassi dell'endpoint sicuro viene descritta in Modifiche a /sso/v1/sdk/secure/session.
  10. Il dominio di Identity convalida authnToken, kmsiToken, quindi il sistema di Identity emette il cookie di sessione SSO e il cookie KMSI.
  11. Durante la sessione, il cookie KMSI viene convalidato per estendere la sessione senza reinserire le credenziali.