Saltar al contenido principal
Para usar las funciones de autenticación backchannel iniciada por el cliente (CIBA), debes tener un plan Enterprise o un complemento adecuado. Consulta Auth0 Pricing para obtener más información.
autenticación backchannel iniciada por el cliente (CIBA) es una especificación de que permite que una aplicación cliente inicie un flujo de autenticación y/o sin requerir interacción directa del usuario en la aplicación que inicia el flujo. Rich Authorization Requests (RAR) es una extensión de OAuth 2.0 que permite a las aplicaciones cliente solicitar permisos más complejos, más allá de los alcances estándar de OAuth 2.0, en una solicitud de autorización. Puedes usar CIBA con RAR para pasar datos de al en una solicitud backchannel. El parámetro authorization_details contiene detalles sobre la solicitud que puedes usar para personalizar una pantalla de consentimiento y mostrárselos al usuario. Puedes autorizar usuarios con CIBA usando los siguientes canales de notificación:

Casos de uso comunes

Use RAR con el flujo de CIBA en casos de uso que requieran un control más detallado sobre el acceso a los recursos. Entre los casos de uso más comunes se incluyen:
  1. Una aplicación de pagos pide al usuario que confirme una transferencia de dinero. authorization_details se puede personalizar para mostrar los detalles de la transacción.
  2. Un agente de IA muestra al usuario los detalles de una cita médica reprogramada. authorization_details se puede personalizar para mostrar la nueva hora y fecha.

Cómo funciona

El flujo de autorización de usuario con CIBA es similar al flujo de autenticación de usuario con CIBA, en el que la compatibilidad con RAR permite a los clientes pasar authorization_details al Servidor de autorización a través del endpoint /bc-authorize. El siguiente diagrama de secuencia explica el flujo completo de autorización de usuario con CIBA de extremo a extremo:
En las siguientes secciones se explica paso a paso cómo funciona la autorización de usuario con CIBA.

Requisitos previos

Para iniciar una solicitud de CIBA con Auth0, debe:

Paso 1: La aplicación cliente inicia una solicitud de CIBA

Utilice las API de búsqueda de usuarios para encontrar al usuario que debe autorizar la solicitud para el que desea iniciar una solicitud de CIBA y obtener su ID de usuario. Una vez que tenga el ID del usuario que debe autorizar la solicitud, utilice la Authentication API para enviar una solicitud de CIBA con authorization_details al endpoint /bc-authorize:
curl --location 'https://{YOUR_DOMAIN}.auth0.com/bc-authorize' \
  --request POST \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'client_id={YOUR_CLIENT_ID}' \
  --data-urlencode 'client_secret={YOUR_CLIENT_SECRET}' \
  --data-urlencode 'login_hint={ "format": "iss_sub", "iss": "https://{YOUR_DOMAIN}.auth0.com/", "sub":"{USER_ID}"}' \
  --data-urlencode 'audience=https://api.example.com' \
  --data-urlencode 'binding_message=Confirm payment of 2500' \
  --data-urlencode 'authorization_details=[{
      "type": "money_transfer", 
      "instructedAmount": {
        "amount": 2500, 
        "currency": "USD"
      }, 
      "sourceAccount": "xxxxxxxxxxx1234", 
      "destinationAccount": "xxxxxxxxxxx9876", 
      "beneficiary": "Hanna Herwitz", 
      "subject": "A Lannister Always Pays His Debts"
    }]'
ParámetrosDescripción
tenantNombre del inquilino que se pasa dentro de la estructura login_hint. También puede ser un dominio personalizado. Si se usa el formato iss_sub, el nombre del inquilino se pasa dentro del claim iss.

Ejemplo: login_hint={"format": "iss_sub", "iss": "https://{YOUR_DOMAIN}.auth0.com/", "sub":"{USER_ID"}
client_idIdentificador de la aplicación cliente.
client_secretMétodo de autenticación del cliente que se usa para la autenticación del usuario con CIBA, como Secreto del cliente, Private Key JWT o autenticación mTLS. Si usa Private Key JWT o mTLS, no necesita incluir el secreto del cliente.
scopeDebe incluir openid.

El scope puede incluir opcionalmente offline_access para solicitar un Token de actualización. Sin embargo, para la autorización única de una transacción con el flujo CIBA, no se necesita un Token de actualización y no tiene ningún significado en este contexto.
user_idID del usuario autorizador que se pasa dentro de la estructura login_hint. Si se usa el formato iss_sub, el ID de usuario se pasa dentro del claim sub.

Ejemplo: login_hint={"format": "iss_sub", "iss": "https://{YOUR_DOMAIN}.auth0.com/", "sub":"{USER_ID}"}

El ID de usuario puede tener un formato diferente según el proveedor externo.
requested_expiryLa expiración solicitada del flujo CIBA debe estar entre 1 y 259200 segundos (72 horas), y el valor predeterminado es 300 segundos. Incluya el parámetro requested_expiry para establecer una expiración personalizada para el flujo CIBA.

El parámetro requested_expiry ayuda a determinar qué canal de notificación usa CIBA:
  • Si establece requested_expiry en un valor de 300 segundos o menos, CIBA usa el canal de notificaciones push móviles si está habilitado. Si no ha configurado MFA para su inquilino, la solicitud de CIBA falla.
  • Si establece requested_expiry en un valor entre 301 y 259200 segundos, CIBA usa el canal de notificación por correo electrónico si está habilitado.
binding_messageMensaje legible usado para vincular el flujo CIBA entre los dispositivos de autenticación y de consumo. El mensaje de vinculación es obligatorio y puede tener hasta 64 caracteres. Use solo caracteres alfanuméricos y +-_.,:#
audienceIdentificador único de la audiencia del token emitido.
authorization_detailsUna matriz JSON opcional de objetos que describe los permisos que se van a autorizar. Debe registrar el valor type de cada objeto en el servidor de recursos mediante el parámetro authorization_details del servidor de recursos. Para obtener más información, consulte Configure Rich Authorization Requests.

Paso 2: El inquilino de Auth0 confirma la solicitud CIBA

Si el inquilino de Auth0 recibe correctamente la solicitud POST, deberías recibir una respuesta que contenga un auth-req-id que haga referencia a la solicitud:
{
    "auth_req_id": "eyJh...",
    "expires_in": 300,
    "interval": 5
}
El valor auth_req_id se envía al endpoint /token para consultar periódicamente si el flujo CIBA se ha completado.

Paso 3: La aplicación cliente consulta periódicamente si hay una respuesta

Utilice la Authentication API para llamar al endpoint /token con el grant type urn:openid:params:grant-type:ciba y el auth_req_id que recibió del endpoint /bc-authorize:
curl --location 'https://{YOUR_DOMAIN}.auth0.com/oauth/token' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'client_id={YOUR_CLIENT_ID}' \
  --data-urlencode 'client_secret={YOUR_CLIENT_SECRET}' \
  --data-urlencode 'auth_req_id={AUTH_REQ_ID}' \
  --data-urlencode 'grant_type=urn:openid:params:grant-type:ciba'
Hasta que el usuario que debe autorizar apruebe la transacción, debería recibir la siguiente respuesta:
{
    "error": "authorization_pending",
    "error_description": "La autorización del usuario final está pendiente"
}
Hay un intervalo de espera de aproximadamente cinco segundos entre cada sondeo. Si realiza sondeos con demasiada frecuencia, recibirá la siguiente respuesta, donde la descripción varía según el intervalo de espera progresiva:
{
"error": "slow_down",
"error_description": "You are polling faster than allowed. Try again in 10 seconds."
"interval": 10
}
Para resolver el error, espere al siguiente intervalo (en segundos) antes de volver a consultar el endpoint /token.

Paso 4: El dispositivo de autenticación recibe la notificación

Según el canal de notificación, Auth0 envía una notificación al dispositivo de autenticación: El dispositivo de autenticación obtiene los detalles del consentimiento, es decir, el contenido de binding_message, de la API de consentimiento de Auth0:
  • Notificación push móvil: La aplicación Auth0 Guardian o una aplicación personalizada integrada con el SDK de Auth0 Guardian llama a la API de consentimiento de Auth0 para obtener los detalles del consentimiento.
  • Notificación por correo electrónico: Cuando el usuario hace clic en el enlace de verificación, se le redirige al navegador, que obtiene los detalles del consentimiento de la API de consentimiento de Auth0.
La API de consentimiento de Auth0 responde al dispositivo de autenticación con los detalles del consentimiento, incluidos binding_message, scope, audience y authorization_details, si están configurados. Los alcances que se devuelven a la aplicación móvil se filtran de acuerdo con su política de RBAC. Para obtener más información, consulte Control de acceso basado en roles. El siguiente ejemplo de código muestra una respuesta de la API de consentimiento de Auth0:
{
  "id": "cns_2309dsfsd098",
  "requested_details": {
    "audience": "https://api.example.com",
    "scope": ["read:profile", "write:profile"],
    "binding_message": "abc123",
    "authorization_details": [
      {
        "type": "money_transfer",
        "instructedAmount": {
          "amount": 2500,
          "currency": "USD"
        },
        "sourceAccount": "xxxxxxxxxxx1234",
        "destinationAccount": "xxxxxxxxxxx9876",
        "beneficiary": "Hanna Herwitz",
        "subject": "A Lannister Always Pays His Debts"
      }
    ]
  },
  "created_at": 1632739200,
  "expires_at": 1632739200
}
El dispositivo de autenticación presenta al usuario los detalles de consentimiento con authorization_details: En este punto, el usuario puede aceptar o rechazar la solicitud de autorización.

Paso 7: El dispositivo de autenticación envía la respuesta del usuario a Auth0

Después de que el usuario acepta o rechaza la solicitud de autorización, el dispositivo de autenticación envía la respuesta del usuario a Auth0:

Paso 8: Auth0 recibe la respuesta del usuario una vez completado el flujo

La aplicación cliente completa el sondeo al recibir una respuesta del endpoint /token. Un flujo de CIBA siempre requiere una respuesta del usuario que autoriza, ya sea de aprobación o de rechazo, y no se comprueban las autorizaciones ya concedidas. Esto significa que Auth0 trata cada solicitud de CIBA como una nueva autorización para el usuario que autoriza.

Paso 9: Auth0 devuelve el token de acceso a la aplicación cliente

Si el usuario rechaza la solicitud push, Auth0 devuelve a la aplicación cliente una respuesta de error como la siguiente:
{
    "error": "access_denied",
    "error_description": "El usuario final denegó la solicitud de autorización o ha caducado"
}
Si el usuario aprueba la solicitud de notificación push, Auth0 devuelve a la aplicación cliente un con authorization_details como los siguientes:
{
  "id_token": "...",
  "access_token": "...",
  "expires_in": "...",
  "scope": "{SCOPES}",
  "authorization_details": [{
      "type": "money_transfer", 
      "instructedAmount": {
        "amount": 2500, 
        "currency": "USD"
      }, 
      "sourceAccount": "xxxxxxxxxxx1234", 
      "destinationAccount": "xxxxxxxxxxx9876", 
      "beneficiary": "Hanna Herwitz", 
      "subject": "A Lannister Always Pays His Debts"
    }]
}
El refresh_token solo estará presente si el scope offline_access se incluyó en la solicitud inicial a /bc-authorize.

Consultar authorization_details

En tiempo de compilación, puede consultar el tipo y los objetos de authorization_details a partir de los detalles de consentimiento de forma segura en cuanto a tipos, igual que consultaría JSON de forma dinámica:
let requestedDetails: ConsentRequestedDetails = payload.requestedDetails
let myAuthorizationDetailsTypes = requestedDetails.authorizationDetails[0].objectValue!;
let type = myAuthorizationDetailsTypes["type"]?.stringValue // Su valor de tipo preregistrado
let stringProperty = myAuthorizationDetailsTypes["string_property"]?.stringValue
let boolProperty = myAuthorizationDetailsTypes["bool_property"]?.boolValue
let numericProperty = myAuthorizationDetailsTypes["numeric_property"]?.doubleValue
let nestedObjectProperty = myAuthorizationDetailsTypes["nested_property"]?.objectValue
let nestedArrayProperty = myAuthorizationDetailsTypes["nested_array_property"]?.arrayValue
Si define un tipo personalizado para representar su objeto, puede usar la función filterAuthorizationDetailsByType() para devolver todos los objetos authorization_details que coincidan con el tipo deseado. En la siguiente muestra de código se consulta authorization_details con el tipo payment:
// Debe implementar AuthorizationDetailsType 
struct Payment : AuthorizationDetailsType { 
static let type = "payment"; 
let amount: Double; 
let currency: String; 
} 

... 

let requestedDetails: ConsentRequestedDetails = payload.requestedDetails 
let payments = requestedDetails.filterAuthorizationDetailsByType(Payment.self) 
let firstPayment = payments.first!
let type: String = firstPayment.type // "payment" 
let amount: Double = firstPayment.amount 
let currency: String = firstPayment.currency
filterAuthorizationDetailsByType() solo devuelve objetos que coinciden con el tipo de authorization_details especificado. Como resultado, su aplicación móvil debe presentar al usuario todos los authorization_details pertinentes para el consentimiento, independientemente de su tipo, a fin de garantizar una comprensión completa de la solicitud También puede consultar authorization_details cuando el agente de IA o la aplicación sondea el endpoint /oauth/token para obtener una respuesta:
curl --request POST \
  --url "https://{YOUR_DOMAIN}.auth0.com/oauth/token" \
  --header "Content-Type: application/x-www-form-urlencoded" \
  --data-urlencode "grant_type=urn:openid:params:grant-type:ciba" \
  --data-urlencode "client_id={YOUR_CLIENT_ID}" \
  --data-urlencode "client_secret={YOUR_CLIENT_SECRET}" \
  --data-urlencode "auth_req_id={AUTH_REQ_ID}"
ParámetrosDescripción
grant_typeDefínalo como el tipo de concesión de CIBA: urn:openid:params:grant-type:ciba
client_idDefínalo como el ID de cliente de la aplicación.
client_secretDefínalo como el secreto del cliente de la aplicación.
auth_req_idLo devuelve el inquilino de Auth0 cuando confirma la solicitud de CIBA. Hace referencia a la solicitud de CIBA.
Cuando el usuario autorizador aprueba la solicitud, Auth0 recibe la respuesta del usuario y el flujo de CIBA se completa, devolviendo un token de acceso y el array authorization_details:
{ 
  "access_token": "ey...ZQ", 
  "expires_in": 86400, 
  "authorization_details": [{ 
    "type": "money_transfer", 
    "instructedAmount": {
      "amount": 2500, 
      "currency": "USD"
    }, 
    "sourceAccount": "xxxxxxxxxxx1234", 
    "destinationAccount": "xxxxxxxxxxx9876", 
    "beneficiary": "Hanna Herwitz", 
    "subject": "A Lannister Always Pays His Debts" 
  }], 
  "token_type": "Bearer" 
}

Limitaciones

Auth0 no admite:
  • Modificar RAR en Actions para flujos de CIBA.
  • Anunciar tipos de RAR para que los clientes puedan descubrirlos, lo que significa que debes prerregistrar a los clientes con los tipos de authorization_details que pueden enviar.
  • Validar objetos RAR más allá de comprobar que tengan una propiedad type que coincida con los tipos permitidos para la API. Tu servidor de recursos es responsable de la validación detallada del contenido de authorization_details. Para obtener más información, consulta Configurar RAR.

Más información