Utilizzo della sicurezza Duo con i domini di Identity

Aggiornamento delle impostazioni dei fattori di autenticazione con le impostazioni di sicurezza Duo

L'esempio seguente mostra come aggiornare le impostazioni di autenticazione con più fattori per un tenant sottomettendo una richiesta PUT sulla risorsa REST utilizzando cURL. Per ulteriori informazioni su cURL, vedere Usa cURL.

Comando cURL

Nota

Il comando in questo esempio utilizza la struttura URL https://<domainURL>/resource-path, dove <domainURL> rappresenta l'URL del servizio Identity e il percorso della risorsa rappresenta l'API del servizio Identity. Per la struttura URL appropriata da utilizzare, vedere Invia richieste.
   curl
-X PUT
   -H "Content-Type:application/scim+json"
   -H "Authorization: Bearer <Access Token Value>"
https://<domainURL>/admin/v1/AuthenticationFactorSettings/<ID>

Corpo richiesta

Di seguito è riportato un esempio del corpo della richiesta in formato JSON.
Corpo della richiesta di esempio
{
  "bypassCodeSettings": {
    "helpDeskCodeExpiryInMins": 60,
    "helpDeskGenerationEnabled": true,
    "helpDeskMaxUsage": 5,
    "length": 12,
    "maxActive": 5,
    "selfServiceGenerationEnabled": true
  },
  "clientAppSettings": {
    "deviceProtectionPolicy": "NONE",
    "initialLockoutPeriodInSecs": 30,
    "keyPairLength": 2048,
    "lockoutEscalationPattern": "Constant",
    "maxFailuresBeforeLockout": 10,
    "maxFailuresBeforeWarning": 5,
    "maxLockoutIntervalInSecs": 86400,
    "minPinLength": 6,
    "policyUpdateFreqInDays": 7,
    "requestSigningAlgo": "SHA256withRSA",
    "sharedSecretEncoding": "Base32",
    "unlockAppForEachRequestEnabled": false,
    "unlockAppIntervalInSecs": 300,
    "unlockOnAppForegroundEnabled": false,
    "unlockOnAppStartEnabled": false
  },
  "compliancePolicy": [
    {
      "action": "Allow",
      "name": "lockScreenRequired",
      "value": "false"
    },
    {
      "action": "Allow",
      "name": "lockScreenRequiredUnknown",
      "value": "false"
    },
    {
      "action": "Allow",
      "name": "jailBrokenDevice",
      "value": "false"
    },
    {
      "action": "Allow",
      "name": "jailBrokenDeviceUnknown",
      "value": "false"
    },
    {
      "action": "Allow",
      "name": "minWindowsVersion",
      "value": "8.1"
    },
    {
      "action": "Allow",
      "name": "minIosVersion",
      "value": "7.1"
    },
    {
      "action": "Allow",
      "name": "minAndroidVersion",
      "value": "4.1"
    },
    {
      "action": "Allow",
      "name": "minIosAppVersion",
      "value": "4.0"
    },
    {
      "action": "Allow",
      "name": "minAndroidAppVersion",
      "value": "8.0"
    },
    {
      "action": "Allow",
      "name": "minWindowsAppVersion",
      "value": "1.0"
    }
  ],
  "endpointRestrictions": {
    "maxEndpointTrustDurationInDays": 15,
    "maxEnrolledDevices": 5,
    "maxTrustedEndpoints": 5,
    "trustedEndpointsEnabled": true,
    "maxIncorrectAttempts": 10
  },
  "id": "AuthenticationFactorSettings",
  "mfaEnrollmentType": "Required",
  "pushEnabled": false,
  "schemas": [
    "urn:ietf:params:scim:schemas:oracle:idcs:AuthenticationFactorSettings"
  ],
  "thirdPartyFactor": {
        "duoSecurity": true
    },
  "notificationSettings": {
        "pullEnabled": true
    },
     "urn:ietf:params:scim:schemas:oracle:idcs:extension:thirdParty:AuthenticationFactorSettings": {
        "duoSecuritySettings": {
            "integrationKey": "XXXXXXXXXXXXXXXXXXXX",
            "secretKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            "apiHostname": "api-example.duosecurity.com",
            "userMappingAttribute": "userName"
    }
    },
  "securityQuestionsEnabled": false,
  "smsEnabled": false,
  "emailEnabled": false,
  "bypassCodeEnabled": false,
  "totpEnabled": false,
  "totpSettings": {
    "hashingAlgorithm": "SHA1",
    "jwtValidityDurationInSecs": 300,
    "keyRefreshIntervalInDays": 60,
    "passcodeLength": 6,
    "smsOtpValidityDurationInMins": 10,
    "smsPasscodeLength": 6,
    "timeStepInSecs": 30,
    "timeStepTolerance": 3,
	"emailOtpValidityDurationInMins": 10,
	"emailPasscodeLength": 6
  },
  "mfaEnabledCategory": "NONE"
}

Corpo risposta

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

Corpo della risposta di esempio
{
    "bypassCodeSettings": {
        "helpDeskCodeExpiryInMins": 60,
        "helpDeskGenerationEnabled": true,
        "helpDeskMaxUsage": 5,
        "length": 12,
        "maxActive": 5,
        "selfServiceGenerationEnabled": true
    },
    "clientAppSettings": {
        "deviceProtectionPolicy": "NONE",
        "initialLockoutPeriodInSecs": 30,
        "keyPairLength": 2048,
        "lockoutEscalationPattern": "Constant",
        "maxFailuresBeforeLockout": 10,
        "maxFailuresBeforeWarning": 5,
        "maxLockoutIntervalInSecs": 86400,
        "minPinLength": 6,
        "policyUpdateFreqInDays": 7,
        "requestSigningAlgo": "SHA256withRSA",
        "sharedSecretEncoding": "Base32",
        "unlockAppForEachRequestEnabled": false,
        "unlockAppIntervalInSecs": 300,
        "unlockOnAppForegroundEnabled": false,
        "unlockOnAppStartEnabled": false
    },
    "compliancePolicy": [
        {
            "action": "Allow",
            "name": "lockScreenRequired",
            "value": "false"
        },
        {
            "action": "Allow",
            "name": "lockScreenRequiredUnknown",
            "value": "false"
        },
        {
            "action": "Allow",
            "name": "jailBrokenDevice",
            "value": "false"
        },
        {
            "action": "Allow",
            "name": "jailBrokenDeviceUnknown",
            "value": "false"
        },
        {
            "action": "Allow",
            "name": "minWindowsVersion",
            "value": "8.1"
        },
        {
            "action": "Allow",
            "name": "minIosVersion",
            "value": "7.1"
        },
        {
            "action": "Allow",
            "name": "minAndroidVersion",
            "value": "4.1"
        },
        {
            "action": "Allow",
            "name": "minIosAppVersion",
            "value": "4.0"
        },
        {
            "action": "Allow",
            "name": "minAndroidAppVersion",
            "value": "8.0"
        },
        {
            "action": "Allow",
            "name": "minWindowsAppVersion",
            "value": "1.0"
        }
    ],
    "endpointRestrictions": {
        "maxEndpointTrustDurationInDays": 15,
        "maxEnrolledDevices": 5,
        "maxTrustedEndpoints": 5,
        "trustedEndpointsEnabled": true,
        "maxIncorrectAttempts": 10
    },
    "id": "AuthenticationFactorSettings",
    "mfaEnrollmentType": "Required",
    "pushEnabled": false,
    "schemas": [
        "urn:ietf:params:scim:schemas:oracle:idcs:AuthenticationFactorSettings"
    ],
    "thirdPartyFactor": {
        "duoSecurity": true
    },
    "notificationSettings": {
        "pullEnabled": true
    },
    "urn:ietf:params:scim:schemas:oracle:idcs:extension:thirdParty:AuthenticationFactorSettings": {
        "duoSecuritySettings": {
            "integrationKey": "XXXXXXXXXXXXXXXXXXXX",
            "secretKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            "apiHostname": "api-example.duosecurity.com",
            "userMappingAttribute": "userName"
        }
    },
    "securityQuestionsEnabled": false,
    "smsEnabled": false,
    "emailEnabled": false,
    "bypassCodeEnabled": false,
    "totpEnabled": false,
    "totpSettings": {
        "hashingAlgorithm": "SHA1",
        "jwtValidityDurationInSecs": 300,
        "keyRefreshIntervalInDays": 60,
        "passcodeLength": 6,
        "smsOtpValidityDurationInMins": 10,
        "smsPasscodeLength": 6,
        "timeStepInSecs": 30,
        "timeStepTolerance": 3,
        "emailOtpValidityDurationInMins": 10,
        "emailPasscodeLength": 6
    },
    "meta": {
        "lastModified": "2022-10-15T07:44:53.601Z",
        "resourceType": "AuthenticationFactorSettings",
        "created": "2022-10-04T06:56:10.285Z",
        "location": "https://<domainURL>/admin/v1/AuthenticationFactorSettings/AuthenticationFactorSettings"
    },
    "idcsLastModifiedBy": {
        "value": "5753639d3ca046f094a8f4aeaf9ea5e5",
        "type": "App",
        "display": "testPostman",
        "$ref": "https://<domainURL>/admin/v1/Apps/5753639d3ca046f094a8f4aeaf9ea5e5"
    },
    "idcsCreatedBy": {
        "value": "c480fd39014e40f3bf4f963b3b6a423b",
        "type": "App",
        "display": "idcssm",
        "$ref": "https://<domainURL>/admin/v1/Apps/c480fd39014e40f3bf4f963b3b6a423b"
    },
    "mfaEnabledCategory": "NONE"
}

Abilitazione di Duo Web SDK v4

L'SDK Web Duo v2 (iFrame) è abilitato in un dominio di Identity per impostazione predefinita. Per utilizzare Duo Web SDK v4, è necessario abilitarlo.

Per abilitare Duo Web SDK v4, attenersi alle istruzioni riportate di seguito.

  1. Uso di cURL, GET /admin/v1/AuthenticationFactorSettings/AuthenticationFactorSettings

    Esempio di risposta

    Dovresti vedere le seguenti impostazioni di Duo Web SDK v2.

    "urn:ietf:params:scim:schemas:oracle:idcs:extension:thirdParty:AuthenticationFactorSettings": {
       "duoSecuritySettings": {
          "integrationKey": "<integration-key>",
          "secretKey": "<secret-key>",
          "apiHostname": "api-example.duosecurity.com",
          "userMappingAttribute": "userName"
    }
  2. Eseguire il backup dell'istanza se è necessario eseguire il rollback.
  3. Aggiornare il payload dal passo 1 aggiungendo enableWebSDKv4 e duoSecurityAuthzRedirectUrl nella sezione urn:ietf:params:scim:schemas:oracle:idcs:extension:thirdParty:AuthenticationFactorSettings.

    • enableWebSDKv4: il valore predefinito è false. Se enableWebSDKv4 è false, viene utilizzato Duo Web SDK v2.
    • duoSecurityAuthzRedirectUrl: il valore predefinito è vuoto. Aggiungere qui l'URL dell'organizzazione. L'URL di reindirizzamento viene utilizzato per avviare l'autenticazione di sicurezza Duo, che riceve una risposta dal server di sicurezza Duo con duoSecurityAuthzState e duoSecurityAuthzCode. È possibile eseguire l'override di questo URL mediante l'interfaccia utente personalizzata. L'interfaccia utente personalizzata deve utilizzare questo endpoint per ricevere il codice e il parametro dal server di sicurezza Duo.

    Tenere presente che l'attributo seguente cambia da v2 a v4.

    • client_id (integrationKey in v2)
    • clientSecret (secretKey in v2)
    • apiHostName (nessuna modifica da v2)
    • userMappingAttribute (nessuna modifica da v2)

    Esempio di richiesta

    "urn:ietf:params:scim:schemas:oracle:idcs:extension:thirdParty:AuthenticationFactorSettings": {
       "duoSecuritySettings": {
           "integrationKey": "<integration-key>",
           "secretKey": ""<secret-key>"",
           "apiHostname": "api-6ff7f509.duosecurity.com",
           "userMappingAttribute": "primaryEmail",
           "enableWebSDKv4": true,
           "duoSecurityAuthzRedirectUrl": "https://abc.co/a/c"
       }
    }
  4. Utilizzando cURL, PUT /admin/v1/AuthenticationFactorSettings/AuthenticationFactorSettings utilizzando il payload del passo 3.

Autenticazione del nome utente e della password con la sicurezza Duo come fattore di autenticazione

Questo caso d'uso fornisce un esempio dettagliato dell'utilizzo dell'API REST dei domini di Identity per autenticare gli utenti ed eseguire la registrazione e l'autenticazione con più fattori con Duo Web SDK v2 o Duo Web SDK v4.

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.

In questo caso d'uso sono inclusi i seguenti set di esempio:

Registrare un nuovo utente con sicurezza Duo mediante Web SDK v2

Questo caso d'uso fornisce un esempio dettagliato dell'utilizzo dell'API REST dei domini di Identity per registrare un nuovo utente e un dispositivo associato al kit SDK Web Duo v2.

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 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": "4uy3^1k0000000000",
    "nextAuthFactors": [
        "TOTP",
        "SECURITY_QUESTIONS",
        "DUO_SECURITY",
        "SMS",
        "EMAIL",
        "PUSH"
    ],
    "EnrolledAccountRecoveryFactorsDetails": {
        "EMAIL": {
            "credentials": [
                "accountRecoveryFactor"
            ],
            "enrolledDevices": [
                {
                    "displayName": "clarence.saladna@example.com"
                }
            ]
        },
        "enrolledAccRecFactorsList": [
            "EMAIL"
        ]
    },
    "TOTP": {
        "credentials": [
            "offlineTotp"
        ]
    },
    "SMS": {
        "credentials": [
            "phoneNumber",
            "countryCode"
        ]
    },
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "mfaSettings": {
        "enrollmentRequired": false
    },
    "scenario": "ENROLLMENT",
    "requestState": "{{requestState}}"
}

In questo esempio di caso d'uso, l'iscrizione viene inviata al passo successivo per avviare l'iscrizione per l'utente.

Passo 3: Avvia richiesta di iscrizione sicurezza Duo

Questo passo avvia l'iscrizione a Duo Security. 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": "DUO_SECURITY",
    "requestState": "{{requestState}}"
}

Esempio di risposta

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

{
   "status": "success",
   "ecId": "4uy3^1k0000000000",
   "DUO_SECURITY": {
      "credentials": [
         "duoSecurityResponse"
      ],
      "authnDetails": {
         "duoSecurityChallenge": "TX
          |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1NjMwNTM=
          |5853cc561ded98c72426b633a1b1e719401e2345:APP
          |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1NjYzNTM=
          |37f594101a380ff3902e0a2cb545346ed196bbca",
         "duoSecurityHost": "api-example.duosecurity.com"
      }
   },
   "nextOp": [
       "credSubmit",
       "createToken",
       "createSession",
       "enrollment"
   ],
   "mfaSettings": {
       "enrollmentRequired": false
   },
   "scenario": "ENROLLMENT",
   "requestState": "{{requestState}}"
}

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.

Passo 4: avviare l'autenticazione di sicurezza Duo

Utilizzare l'SDK Web v2 di Duo per integrare i domini di Identity con Duo Security. Duo offre una libreria JavaScript che interagisce con iFrame utilizzata per l'autenticazione secondaria.

Dopo l'autenticazione primaria, è necessario passare i dettagli di autenticazione, ad esempio duoSecurityHost e duoSecurityChallenge, ricevuti dai domini di Identity a iFrame. È possibile utilizzare l'esempio riportato di seguito per avviare l'autenticazione di sicurezza Duo e caricare iFrame per stabilire una connessione con il server di sicurezza Duo.

function duo(msg, duoSecurityCallback) {
    Duo.init({iframe: "duo_iframe",
            host: msg.DUO_SECURITY.authnDetails.duoSecurityHost,
            sig_request: msg.DUO_SECURITY.authnDetails.duoSecurityChallenge,
            submit_callback: duoSecurityCallback,
            post_argument: "resp"
    });
}

Dopo aver completato il processo di autenticazione Duo, Duo chiama il metodo duoSecurityCallback per ottenere una risposta Duo.

var duoSecurityCallback = function(details, credentials) {
       var credentials = {};
       credentials.duoSecurityResponse = details.firstElementChild.value;
       operation = "credSubmit";
       initiateAuth(credentials); 
}

Una volta ricevuta la risposta per la sicurezza Duo, è necessario passare la risposta ai domini di Identity per completare l'autenticazione.

Passo 5: 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": {  
       "duoSecurityResponse": "AUTH
      |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1NjM5NjA=
      |f2d0df2a189219a8e85db190ac66fab33be996c3:APP
      |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1Njc0NTU=
      |a3b7c901e845ebd80451ab670473e983707a8459"
   },
   "requestState":"{{requestState}}"
}

Esempio di risposta

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

{
    "status": "success",
    "ecId": "4uy3^1k0000000000",
    "displayName": "{{username}}'s Duo Security Account",
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "scenario": "ENROLLMENT",
    "requestState": "{{requestState}}"
}

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.

Passo 6: 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: ricevuto nella risposta del passo 5

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

Registrare un nuovo utente con sicurezza Duo mediante Web SDK v4

Questo caso d'uso fornisce un esempio dettagliato dell'utilizzo dell'API REST dei domini di Identity per registrare un nuovo utente e un dispositivo associato al kit SDK Web Duo v4.

Nota

Se è necessario abilitare Duo Web SDK v4, vedere Abilitazione di Duo Web SDK v4.
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 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": "4uy3^1k0000000000",
    "nextAuthFactors": [
        "TOTP",
        "SECURITY_QUESTIONS",
        "DUO_SECURITY",
        "SMS",
        "EMAIL",
        "PUSH"
    ],
    "EnrolledAccountRecoveryFactorsDetails": {
        "EMAIL": {
            "credentials": [
                "accountRecoveryFactor"
            ],
            "enrolledDevices": [
                {
                    "displayName": "clarence.saladna@example.com"
                }
            ]
        },
        "enrolledAccRecFactorsList": [
            "EMAIL"
        ]
    },
    "TOTP": {
        "credentials": [
            "offlineTotp"
        ]
    },
    "SMS": {
        "credentials": [
            "phoneNumber",
            "countryCode"
        ]
    },
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "mfaSettings": {
        "enrollmentRequired": false
    },
    "scenario": "ENROLLMENT",
    "requestState": "{{requestState}}"
}

In questo esempio di caso d'uso, l'iscrizione viene inviata al passo successivo per avviare l'iscrizione per l'utente.

Passo 3: Avvia richiesta di iscrizione sicurezza Duo

Esempio di richiesta

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

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

Esempio di risposta

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

{
   "status": "success",
   "ecId": "i2tul0R0000000000",
   "nextAuthFactors": [
      "DUO_SECURITY"
   ],
   "DUO_SECURITY": {
      "credentials": [
         "duoSecurityAuthzCode",
         "duoSecurityAuthzState"
      ],
      "authnDetails": {
         "duoSecurityAuthzRequest": "https://api-xxxxxxxx.duosecurity.com/oauth/v1/authorize?response_type=code&client_id=<client_id>&redirect_uri=duoSecurityAuthzRedirectURL&state=3047103d-d707-4b94-a960-203430071154&request=<request>"
      }
   },
   "nextOp": [
      "credSubmit",
      "getBackupFactors"
   ],
   "scenario": "AUTHENTICATION",
   "requestState": "requestState",
   "trustedDeviceSettings": {
      "trustDurationInDays": 15
   }
}

Passo 4: avviare l'autenticazione di sicurezza Duo

Durante l'autenticazione di sicurezza Duo, il browser esegue il reindirizzamento al server di sicurezza Duo, il server di sicurezza Duo carica quindi la pagina di autenticazione secondaria in cui l'utente esegue l'autenticazione secondaria. Dopo l'autenticazione riuscita, il server di sicurezza Duo risponde con i parametri di stato (duoSecurityAuthzState) e codice (duoSecurityAuthzCode). Per completare l'autenticazione, è necessario sottomettere questi parametri al dominio di Identity.

Per ottenere i parametri di stato e codice, attenersi alla procedura riportata di seguito.

  1. Ottenere l'URL a cui eseguire il reindirizzamento da duoSecurityAuthzRequest.

    Ad esempio:
    "duoSecurityAuthzRequest": "https://api-xxxxxxxx.duosecurity.com/oauth/v1/authorize?response_type=code&client_id=<client_id>&redirect_uri=duoSecurityAuthzRedirectURL&state=3047103d-d707-4b94-a960-203430071154&request=<request>"

    L'URL di reindirizzamento per duoSecurityAuthzRedirectURL.

  2. Eseguire il reindirizzamento 303 al server di sicurezza Duo.

  3. Completare il processo di registrazione e autenticazione della sicurezza Duo.

    Il server di sicurezza Duo esegue il reindirizzamento a duoSecurityAuthzRedirectURL con duoSecurityAuthzState e duoSecurityAuthzCode.

Passo 5: Sottometti credenziali fattore

Passare duoSecurityAuthzState e duoSecurityAuthzCode dalla risposta al dominio di Identity per completare l'autenticazione.

Esempio di richiesta

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

{
    "op": "credSubmit",
    "credentials":
   {
      "duoSecurityAuthzCode": "<duo-security-authz-code>",
      "duoSecurityAuthzState": "<duo-security-authz-state>"
   }
,
    "requestState": "requestState"}'

Esempio di risposta

{
    "status": "success",
    "ecId": "4uy3^1k0000000000",
    "displayName": "{{username}}'s Duo Security Account",
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "scenario": "ENROLLMENT",
    "requestState": "{{requestState}}"
}

Passo 6: 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: ricevuto nella risposta del passo 5

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

Autenticare un account utente con sicurezza Duo mediante Web SDK v2

Questo caso d'uso fornisce un esempio dettagliato dell'utilizzo dell'API di autenticazione dei domini di Identity per autenticare un account utente con Duo Web SDK v2.

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 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": "4uy3^1k0000000000",
    "nextAuthFactors": [
        "TOTP",
        "SECURITY_QUESTIONS",
        "DUO_SECURITY",
        "SMS",
        "EMAIL",
        "PUSH"
    ],
    "EnrolledAccountRecoveryFactorsDetails": {
        "EMAIL": {
            "credentials": [
                "accountRecoveryFactor"
            ],
            "enrolledDevices": [
                {
                    "displayName": "clarence.saladna@example.com"
                }
            ]
        },
        "enrolledAccRecFactorsList": [
            "EMAIL"
        ]
    },
    "TOTP": {
        "credentials": [
            "offlineTotp"
        ]
    },
    "SMS": {
        "credentials": [
            "phoneNumber",
            "countryCode"
        ]
    },
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "mfaSettings": {
        "enrollmentRequired": false
    },
    "scenario": "ENROLLMENT",
    "requestState": "{{requestState}}"
}

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.

Passo 3: avviare l'autenticazione di sicurezza Duo

Utilizzare l'SDK Web v2 di Duo per integrare i domini di Identity con Duo Security. Duo offre una libreria JavaScript che interagisce con iFrame utilizzata per l'autenticazione secondaria.

Dopo l'autenticazione primaria, è necessario passare i dettagli di autenticazione, ad esempio duoSecurityHost e duoSecurityChallenge, ricevuti dai domini di Identity a iFrame. È possibile utilizzare l'esempio riportato di seguito per avviare l'autenticazione di sicurezza Duo e caricare iFrame per stabilire una connessione con il server di sicurezza Duo.

function duo(msg, duoSecurityCallback) {
    Duo.init({iframe: "duo_iframe",
            host: msg.DUO_SECURITY.authnDetails.duoSecurityHost,
            sig_request: msg.DUO_SECURITY.authnDetails.duoSecurityChallenge,
            submit_callback: duoSecurityCallback,
            post_argument: "resp"
    });
}

Dopo aver completato il processo di autenticazione Duo, Duo chiama il metodo duoSecurityCallback per ottenere una risposta Duo.

var duoSecurityCallback = function(details, credentials) {
       var credentials = {};
       credentials.duoSecurityResponse = details.firstElementChild.value;
       operation = "credSubmit";
       initiateAuth(credentials); 
}

Una volta ricevuta la risposta per la sicurezza Duo, è necessario passare la risposta ai domini di Identity per completare l'autenticazione.

Passo 4: Sottometti credenziali fattore

Questo passo sottomette le credenziali del fattore in requestState ricevute nella risposta del passo 2. 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 2

Esempio di richiesta

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

{  
   "op":"credSubmit",
   "credentials": {  
       "duoSecurityResponse": "AUTH
      |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1NjM5NjA=
      |f2d0df2a189219a8e85db190ac66fab33be996c3:APP
      |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1Njc0NTU=
      |a3b7c901e845ebd80451ab670473e983707a8459"
   },
   "requestState":"{{requestState}}"
}

Esempio di risposta

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

{
    "authnToken": "{{authnToken}}",
    "status": "success",
    "ecId": "5MyZ41m0000000000"
}

Autenticare un account utente con sicurezza Duo mediante Web SDK v4

Questo caso d'uso fornisce un esempio dettagliato dell'utilizzo dell'API di autenticazione dei domini di Identity per autenticare un account utente con Duo Web SDK v4.

Nota

Se è necessario abilitare Duo Web SDK v4, vedere Abilitazione di Duo Web SDK v4.
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 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": "4uy3^1k0000000000",
    "nextAuthFactors": [
        "TOTP",
        "SECURITY_QUESTIONS",
        "DUO_SECURITY",
        "SMS",
        "EMAIL",
        "PUSH"
    ],
    "EnrolledAccountRecoveryFactorsDetails": {
        "EMAIL": {
            "credentials": [
                "accountRecoveryFactor"
            ],
            "enrolledDevices": [
                {
                    "displayName": "clarence.saladna@example.com"
                }
            ]
        },
        "enrolledAccRecFactorsList": [
            "EMAIL"
        ]
    },
    "TOTP": {
        "credentials": [
            "offlineTotp"
        ]
    },
    "SMS": {
        "credentials": [
            "phoneNumber",
            "countryCode"
        ]
    },
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "mfaSettings": {
        "enrollmentRequired": false
    },
    "scenario": "ENROLLMENT",
    "requestState": "{{requestState}}"
}

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.

Passo 3: avviare l'autenticazione di sicurezza Duo

Durante l'autenticazione di sicurezza Duo, il browser esegue il reindirizzamento al server di sicurezza Duo, il server di sicurezza Duo carica quindi la pagina di autenticazione secondaria in cui l'utente esegue l'autenticazione secondaria. Dopo l'autenticazione riuscita, il server di sicurezza Duo risponde con i parametri di stato (duoSecurityAuthzState) e codice (duoSecurityAuthzCode). Per completare l'autenticazione, è necessario sottomettere questi parametri al dominio di Identity.

Per ottenere i parametri di stato e codice, attenersi alla procedura riportata di seguito.

  1. Ottenere l'URL a cui eseguire il reindirizzamento da duoSecurityAuthzRequest.

    Ad esempio:
    "duoSecurityAuthzRequest": "https://api-xxxxxxxx.duosecurity.com/oauth/v1/authorize?response_type=code&client_id=<client_id>&redirect_uri=duoSecurityAuthzRedirectURL&state=3047103d-d707-4b94-a960-203430071154&request=<request>"

    L'URL di reindirizzamento per duoSecurityAuthzRedirectURL.

  2. Eseguire il reindirizzamento 303 al server di sicurezza Duo.

  3. Completare il processo di registrazione e autenticazione della sicurezza Duo.

    Il server di sicurezza Duo esegue il reindirizzamento a duoSecurityAuthzRedirectURL con duoSecurityAuthzState e duoSecurityAuthzCode.

Passo 4: Sottometti credenziali fattore

Passare duoSecurityAuthzState e duoSecurityAuthzCode dalla risposta al dominio di Identity per completare l'autenticazione.

Esempio di richiesta

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

{
    "op": "credSubmit",
    "credentials":
   {
      "duoSecurityAuthzCode": "<duo-security-authz-code>",
      "duoSecurityAuthzState": "<duo-security-authz-state>"
   }
,
    "requestState": "requestState"}'

Esempio di risposta

{
    "authnToken": "{{authnToken}}",
    "status": "success",
    "ecId": "5MyZ41m0000000000"
}

Autenticare un utente con sicurezza Duo se utilizzato come fattore di backup

Questo caso d'uso fornisce un esempio dettagliato dell'utilizzo dell'API REST dei domini di Identity per autenticare un account utente con Duo Security anche quando è configurato come fattore di backup.

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

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": "4uy3^1k0000000000",
    "nextAuthFactors": [
        "TOTP",
        "SECURITY_QUESTIONS",
        "DUO_SECURITY",
        "SMS",
        "EMAIL",
        "PUSH"
    ],
    "EnrolledAccountRecoveryFactorsDetails": {
        "EMAIL": {
            "credentials": [
                "accountRecoveryFactor"
            ],
            "enrolledDevices": [
                {
                    "displayName": "clarence.saladna@example.com"
                }
            ]
        },
        "enrolledAccRecFactorsList": [
            "EMAIL"
        ]
    },
    "TOTP": {
        "credentials": [
            "offlineTotp"
        ]
    },
    "SMS": {
        "credentials": [
            "phoneNumber",
            "countryCode"
        ]
    },
    "nextOp": [
        "createToken",
        "createSession",
        "enrollment"
    ],
    "mfaSettings": {
        "enrollmentRequired": false
    },
    "scenario": "ENROLLMENT",
    "requestState": "{{requestState}}"
}

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 getBackupFactors.

Passo 3: ottenere l'elenco dei fattori di backup

Questo passo consente di ottenere la lista dei fattori di backup.

Esempio di richiesta

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

{
    "op": "getBackupFactors",
    "requestState": "{{requestState}}"
}

Esempio di risposta

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

{
    "status": "success",
    "ecId": "5MyZ41p0000000000",
    "nextAuthFactors": [
        "EMAIL",
        "BYPASSCODE",
        "SECURITY_QUESTIONS",
        "DUO_SECURITY"
    ],
    "EMAIL": {
        "credentials": [
            "preferred",
            "deviceId"
        ],
        "enrolledDevices": [
            {
                "deviceId": "790ed820aee048a78de17ebe1ebddb19",
                "displayName": "ashXXXXX@oracle.com"
            }
        ]
    },
    "BYPASSCODE": {
        "credentials": [
            "bypassCode"
        ]
    },
    "SECURITY_QUESTIONS": {
        "credentials": [
            "questionId",
            "answer"
        ],
        "questions": [
            {
                "questionId": "FirstCar",
                "text": "What's the model of your first car?"
            }
        ],
        "preferred": true
    },
    "DUO_SECURITY": {
        "enrolledDevices": [
            {
                "deviceId": "3053eed6249a4dd4835c51bf873c5f85",
                "displayName": "jarvis's Duo Security Account"
            }
        ]
    },
    "nextOp": [
        "credSubmit",
        "getBackupFactors"
    ],
    "scenario": "AUTHENTICATION",
    "requestState": "{{requestState}}",
    "trustedDeviceSettings": {
        "trustDurationInDays": 15
    }
}

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 4: Selezionare la sicurezza Duo dall'elenco dei fattori di backup

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",
    "authFactor": "DUO_SECURITY",
    "credentials": {
        "deviceId": "3053eed6249a4dd4835c51bf873c5f85"
    },
    "requestState": "{{requestState}}"
}

Esempio di risposta

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

{
	"status": "success",
	"ecId": "5MyZ41q0000000000",
	"DUO_SECURITY": {
	"credentials": [
		 "duoSecurityResponse"
	],
	"authnDetails": {
		"duoSecurityChallenge": "TX
			 |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1NjQ1NDg=
			 |230d8328f53ec537ecd033fbb175fbce65930c3e:APP
			 |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1Njc4NDg=
			 |af94d927d3e027141177e8f88baa19f6427502ee",
		   "duoSecurityHost": "api-example.duosecurity.com"
		}
	},
	"nextOp": [
		"credSubmit",
	       "getBackupFactors"
	],
	"scenario": "AUTHENTICATION",
	"requestState": "{{requestState}}",
	"trustedDeviceSettings": {
		"trustDurationInDays": 15
	}
}

Imposta la sicurezza Duo come fattore preferito

Questo caso d'uso fornisce un esempio dettagliato dell'utilizzo dell'API REST dei domini di Identity per impostare la sicurezza Duo come fattore preferito per l'autenticazione.

È possibile impostare il flag preferred su true per impostare la sicurezza Duo come fattore preferito, se un utente ha già un fattore diverso dalla sicurezza Duo come preferito.

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

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": "g5CAF1i1000000000",
   "nextAuthFactors": [
      "DUO_SECURITY"
    ],
    "DUO_SECURITY": {
      "credentials": [
         "duoSecurityResponse"
      ],
      "authnDetails": {
         "duoSecurityChallenge": "TX
            |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1NjM2Njc=
            |73894f83e7ee87c81388f84b4c0015cb86c6fd0b:APP
            |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1NjY5Njc=
            |11f57d2ad044abee78d3290fdff69af7c3d22d71",
         "duoSecurityHost": "api-example.duosecurity.com"
      }
    },
   "nextOp": [
      "credSubmit",
      "getBackupFactors"
    ],
    "scenario": "AUTHENTICATION",
    "requestState": "{{requestState}}",
    "trustedDeviceSettings": {
      "trustDurationInDays": 15
    }
}

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.

Passo 3: avviare l'autenticazione di sicurezza Duo

Utilizzare l'SDK Web v2 di Duo per integrare i domini di Identity con Duo Security. Duo offre una libreria JavaScript che interagisce con iFrame utilizzata per l'autenticazione secondaria.

Dopo l'autenticazione primaria, è necessario passare i dettagli di autenticazione, ad esempio duoSecurityHost e duoSecurityChallenge, ricevuti dai domini di Identity a iFrame. È possibile utilizzare l'esempio riportato di seguito per avviare l'autenticazione di sicurezza Duo e caricare iFrame per stabilire una connessione con il server di sicurezza Duo.

function duo(msg, duoSecurityCallback) {
    Duo.init({iframe: "duo_iframe",
            host: msg.DUO_SECURITY.authnDetails.duoSecurityHost,
            sig_request: msg.DUO_SECURITY.authnDetails.duoSecurityChallenge,
            submit_callback: duoSecurityCallback,
            post_argument: "resp"
    });
}

Dopo aver completato il processo di autenticazione Duo, Duo chiama il metodo duoSecurityCallback per ottenere una risposta Duo.

var duoSecurityCallback = function(details, credentials) {
       var credentials = {};
       credentials.duoSecurityResponse = details.firstElementChild.value;
       operation = "credSubmit";
       initiateAuth(credentials); 
}

Una volta ricevuta la risposta per la sicurezza Duo, è necessario passare la risposta ai domini di Identity per completare l'autenticazione.

Passaggio 4: abilitare la sicurezza Duo come fattore preferito

Questo passaggio consente a Duo Security di essere il fattore preferito. 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": {
    "duoSecurityResponse": "AUTH
      |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1NjQzMzg=
      |4a40cc9c79d4a65b48d0f9b871d7a4e83481b3ca:APP
      |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1Njc4NDg=
      |af94d927d3e027141177e8f88baa19f6427502ee",
    "preferred": true
 },
 "requestState": "{{requestState}}"
}

Esempio di risposta

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

{
    "authnToken": "{{authnToken}}",
    "status": "success",
    "ecId": "5MyZ41r0000000000"
}

Supporto di un dispositivo trusted quando si utilizza Duo come fattore di autenticazione

Questo caso d'uso fornisce un esempio dettagliato dell'utilizzo dell'API REST dei domini di Identity per supportare il dispositivo sicuro quando si utilizza Duo come fattore di autenticazione.

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

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": "g5CAF1i1000000000",
   "nextAuthFactors": [
      "DUO_SECURITY"
    ],
    "DUO_SECURITY": {
      "credentials": [
         "duoSecurityResponse"
      ],
      "authnDetails": {
         "duoSecurityChallenge": "TX
            |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1NjM2Njc=
            |73894f83e7ee87c81388f84b4c0015cb86c6fd0b:APP
            |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1NjY5Njc=
            |11f57d2ad044abee78d3290fdff69af7c3d22d71",
         "duoSecurityHost": "api-example.duosecurity.com"
      }
    },
   "nextOp": [
      "credSubmit",
      "getBackupFactors"
    ],
    "scenario": "AUTHENTICATION",
    "requestState": "{{requestState}}",
    "trustedDeviceSettings": {
      "trustDurationInDays": 15
    }
}

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.

Passo 3: avviare l'autenticazione di sicurezza Duo

Utilizzare l'SDK Web v2 di Duo per integrare i domini di Identity con Duo Security. Duo offre una libreria JavaScript che interagisce con iFrame utilizzata per l'autenticazione secondaria.

Dopo l'autenticazione primaria, è necessario passare i dettagli di autenticazione, ad esempio duoSecurityHost e duoSecurityChallenge, ricevuti dai domini di Identity a iFrame. È possibile utilizzare l'esempio riportato di seguito per avviare l'autenticazione di sicurezza Duo e caricare iFrame per stabilire una connessione con il server di sicurezza Duo.

function duo(msg, duoSecurityCallback) {
    Duo.init({iframe: "duo_iframe",
            host: msg.DUO_SECURITY.authnDetails.duoSecurityHost,
            sig_request: msg.DUO_SECURITY.authnDetails.duoSecurityChallenge,
            submit_callback: duoSecurityCallback,
            post_argument: "resp"
    });
}

Dopo aver completato il processo di autenticazione Duo, Duo chiama il metodo duoSecurityCallback per ottenere una risposta Duo.

var duoSecurityCallback = function(details, credentials) {
       var credentials = {};
       credentials.duoSecurityResponse = details.firstElementChild.value;
       operation = "credSubmit";
       initiateAuth(credentials); 
}

Una volta ricevuta la risposta per la sicurezza Duo, è necessario passare la risposta ai domini di Identity per completare l'autenticazione.

Passaggio 4: abilitare un dispositivo come sicuro

Questo passo abilita un dispositivo come sicuro. Dopo che il dispositivo è stato accettato come sicuro, l'autenticazione MFA non verrà sottoposta a verifica anche se viene registrata la sicurezza Duo.

Esempio di richiesta

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

{
   "op": "credSubmit",
   "credentials": {
       "duoSecurityResponse": "AUTH
         |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1NjQ2MDY=
         |ba16e2eb734e00d9ebe6f8129ce32669437052e9:APP
         |amFydmlzfERJNThZNFhVMlFXWEVSUDQzVTRKfDE1NjE1NjgwNjc=
         |ba4f415559ff2c30b23a912a18ee5f717a398563"
   },
   "trustedDevice": true,
   "trustedDeviceDisplayName": "Postman on Windows",
   "requestState": "{{requestState}}"
}

Esempio di risposta

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

{
    "authnToken": "{{authnToken}}",
    "trustToken": "{{trustToken}}",
    "status": "success",
    "ecId": "5MyZ41u0000000000"
}

Iscrizione all'autenticazione MFA con sicurezza Duo mediante Self Service

Questo caso d'uso fornisce un esempio dettagliato dell'uso dell'API REST dei domini di Identity per la registrazione self-service all'autenticazione con più fattori (MFA) mediante la sicurezza Duo.

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

Come passo prerequisito, è necessario ottenere un token ME prima di seguire questi passi. Per informazioni su come ottenere un token ME, vedere Generating Access Token Using Authentication API.

Nota

In questi passi si presuppone che i fattori rilevanti dell'autenticazione MFA siano abilitati utilizzando Configura impostazioni di autenticazione con più fattori.

Step1: Registra un utente con fattore Duo

Questo passo avvia la registrazione della sicurezza Duo in una richiesta POST all'endpoint /admin/v1/MyAuthenticationFactorEnroller. Il client deve includere il seguente attributo:
  • value: definisce l'ID utente. È possibile effettuare una chiamata GET a {{HOST}}/admin/v1/Me per ottenere il valore "id".

Esempio di richiesta

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

{
   "authnFactors":["THIRDPARTY"],
   "thirdPartyFactor": {
       "thirdPartyVendorName" : "DUO_SECURITY",
       "thirdPartyFactorType" : "None"
   },
   "user": {
      "value" : "012832e2e63d4bfda5bc512f2b52ccbe"
    },
   "schemas": [
       "urn:ietf:params:scim:schemas:oracle:idcs:AuthenticationFactorEnroller"
   ]
}

Esempio di risposta

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

{
    "authnFactors": [
        "THIRDPARTY"
    ],
    "thirdPartyFactor": {
        "thirdPartyFactorId": "1c3a069c240b4a9d9e6e90b9a2be8bed",
        "thirdPartyFactorType": "None",
        "thirdPartyVendorName": "DUO_SECURITY"
    },
    "user": {
        "value": "6852e4e2bc864b3b912d7bd48f9f4879",
        "$ref": "https://<domainURL>admin/v1/Users/6852e4e2bc864b3b912d7bd48f9f4879"
    },
    "schemas": [
        "urn:ietf:params:scim:schemas:oracle:idcs:AuthenticationFactorEnroller"
    ],
    "meta": {
        "resourceType": "MyAuthenticationFactorEnroller",
        "location": "https://<domainURL>admin/v1/MyAuthenticationFactorEnroller"
    },
    "displayName": "test's Phone",
    "requestId": "fe520538-0da6-45a3-b23f-1256091e3f0c",
    "deviceId": "ca0ba497327c45d2a4a408301c78682b"
}

Nella risposta, deviceId e requestId devono essere passati nel passo successivo.

Passo 2: avviare l'autenticazione Duo per l'utente

Questo passo avvia l'autenticazione sul lato di terze parti inviando una richiesta POST all'endpoint /admin/v1/MyAuthenticationFactorInitiator. Il client deve includere i seguenti attributi:

  • requestId: ricevuto nella risposta del passo 1
  • deviceId: ricevuto nella risposta del passo 1
  • userName: nome utente dell'utente

Esempio di richiesta

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

{
    "requestId": "1e513691-9a41-4418-a0f0-f96e6f4c5735",
    "deviceId": "14a2a6f2f41b4c10acc9a6d4b54ffe4a",
    "authFactor": "THIRDPARTY",
    "thirdPartyFactor": {
        "thirdPartyFactorId": "7ed55e203ac7435eb6b4847dcfca28e0",
        "thirdPartyFactorType": "None",
        "thirdPartyVendorName": "DUO_SECURITY"
    },
    "userName": "testuser1",
    "schemas": [
        "urn:ietf:params:scim:schemas:oracle:idcs:AuthenticationFactorInitiator"
    ]
}

Esempio di risposta

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

{
    "requestId": "fe520538-0da6-45a3-b23f-1256091e3f0c",
    "deviceId": "ca0ba497327c45d2a4a408301c78682b",
    "authFactor": "THIRDPARTY",
    "thirdPartyFactor": {
        "thirdPartyFactorId": "1c3a069c240b4a9d9e6e90b9a2be8bed",
        "thirdPartyFactorType": "None",
        "thirdPartyVendorName": "DUO_SECURITY"
    },
    "userName": "testuser1",
    "schemas": [
        "urn:ietf:params:scim:schemas:oracle:idcs:AuthenticationFactorInitiator"
    ],
    "meta": {
        "resourceType": "MyAuthenticationFactorInitiator",
        "location": "https://<domainURL>admin/v1/MyAuthenticationFactorInitiator"
    },
    "additionalAttributes": [
        {
            "name": "duoHost",
            "value": "api-0095dc4a.duosecurity.com"
        },
        {
            "name": "duoChallenge",
            "value": "TX
               |Njg1MmU0ZTJiYzg2NGIzYjkxMmQ3YmQ0OGY5ZjQ4Nzl8RElFWldUV0VMVUJYSEQ2RExKM1V8MTU0MDMyMDkz==
               |8a0b6f0472b1c03357e9d6b3348d0a341c96e6a0:APP
               |Njg1MmU0ZTJiYzg2NGIzYjkxMmQ3YmQ0OGY5ZjQ 4Nzl8RElFWldUV0VMVUJYSEQ2RExKM1V8MTU0MDMyNDIzNA==
               |5d45c215e6e5af7d866df480087d825aa1cf4279"
        }
    ]
}

Nella risposta deviceId e requestId devono essere passati nel passo successivo.

Passo 3: Convalida fattore Duo per scenario iscrizione

Questo passo chiama l'API dei fattori di terze parti con le credenziali raccolte per convalidare la registrazione di un utente in una richiesta POST all'endpoint /admin/v1/MyAuthenticationFactorValidator.

Il client deve includere i seguenti attributi:

  • requestId: ricevuto nella risposta del passo 2
  • deviceId: ricevuto nella risposta del passo 2

Esempio di richiesta

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

{
    "requestId": "1e513691-9a41-4418-a0f0-f96e6f4c5735",
    "deviceId": "14a2a6f2f41b4c10acc9a6d4b54ffe4a",
    "authFactor": "THIRDPARTY",
    "thirdPartyFactor": {
        "thirdPartyFactorId": "7ed55e203ac7435eb6b4847dcfca28e0",
        "thirdPartyFactorType": "None",
        "thirdPartyVendorName": "DUO_SECURITY"
    },
    "scenario": "ENROLLMENT",
    "username": "testuser1",
    "schemas": [
        "urn:ietf:params:scim:schemas:oracle:idcs:AuthenticationFactorValidator"
    ],
    "additionalAttributes": [
        {
            "name": "duoResponse",
            "value": "AUTH|YWJoaXNoZWsuanVsa2FAb3JhY2xlLmNvbXxESUVaV1RXRUxVQlhIRDZETEozVXwxNTM5ODMwNDc2|9439adbea1b90a90c9169f366cc028aabde8ac51:APP|YWJoaXNoZWsuanVsa2FAb3JhY2xlLmNvbXxESUVaV1RXRUxVQlhIRDZETEozVXwxNTM5ODMzODYx|94bcc9a0c4ab6da617827432d021171d3b393fd3"
        }
    ]
}

Esempio di risposta

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

{
    "requestId": "fe520538-0da6-45a3-b23f-1256091e3f0c",
    "deviceId": "ca0ba497327c45d2a4a408301c78682b",
    "authFactor": "THIRDPARTY",
    "thirdPartyFactor": {
        "thirdPartyFactorId": "1c3a069c240b4a9d9e6e90b9a2be8bed",
        "thirdPartyFactorType": "None",
        "thirdPartyVendorName": "DUO_SECURITY"
    },
    "scenario": "ENROLLMENT",
    "userName": "testuser1",
    "schemas": [
        "urn:ietf:params:scim:schemas:oracle:idcs:AuthenticationFactorValidator"
    ],
    "meta": {
        "resourceType": "MyAuthenticationFactorValidator",
        "location": "https://<domainURL>admin/v1/MyAuthenticationFactorValidator"
    },
    "status": "SUCCESS",
    "displayName": "test's Phone",
    "mfaStatus": "ENROLLED",
    "mfaPreferredDevice": "0d37a1334bdf4c9ca80474dcadba8d10",
    "mfaPreferredAuthenticationFactor": "THIRDPARTY",
    "mfaPreferredThirdPartyFactorType": "None",
    "securityQuestionsPresent": false,
    "devicesCount": 1,
    "emailFactorEnrolled": false
}

Nella risposta, l'attributo mfaStatus:"ENROLLED" indica che l'utente si è registrato per l'autenticazione MFA. L'attributo mfaPreferredAuthenticationFactor indica il fattore impostato come metodo preferito. In questo caso, è THIRDPARTY.