> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Aprenda a implementar flujos nativos de claves de acceso para aplicaciones móviles Android e iOS

# Claves de acceso nativas para aplicaciones móviles

export const ReleaseStageNotice = ({feature, stage, plans, contact, terms}) => {
  const stageTextMap = {
    "beta": "Beta",
    "ea": "Acceso anticipado"
  };
  const stageText = stageTextMap[stage] || "una etapa de lanzamiento del producto";
  const prsLink = "/docs/troubleshoot/product-lifecycle/product-release-stages";
  const linkify = (text, url) => {
    return <a href={url} target="_blank" rel="noreferrer" class="link">{text}</a>;
  };
  const includeDetails = (plans, contact, terms) => {
    const hasDetails = terms || plans || contact;
    if (!hasDetails) return null;
    return <span data-as="p">
            {plans && <>Esta funcionalidad está disponible en los {linkify(`planes ${plans}`, "https://auth0.com/pricing")}. </>}
            {contact && "Para participar, ponte en contacto con " + contact + ". "}
            {terms && <>Al usar esta funcionalidad, aceptas los términos aplicables de la prueba gratuita incluidos en el {linkify("Master Subscription Agreement", "https://www.okta.com/legal")} de Okta.</>}
        </span>;
  };
  return <Warning>
            <span data-as="p">
                <strong>La funcionalidad {feature} está en {linkify(stageText, prsLink)}.</strong>
            </span>

            {includeDetails(plans, contact, terms)}
        </Warning>;
};

<ReleaseStageNotice feature="Passkeys nativas" stage="ea" terms="true" />

Las passkeys son una alternativa resistente al phishing a las formas tradicionales de autenticación (como nombre de usuario y contraseña) que ofrecen una experiencia de usuario más sencilla y segura. Se basan en las [especificaciones](https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-errata-20220621.html#intro) de FIDO® W3C Web Authentication (WebAuthn) y Client to Authenticator Protocol (CTAP).

Actualmente, Auth0 admite las passkeys como método de autenticación en conexiones de base de datos y ofrece dos métodos de implementación:

* [Passkeys de Universal Login](/es/docs/authenticate/database-connections/passkeys) para aplicaciones web.
* Passkeys nativas para aplicaciones Android e iOS.
* [Embedded Login para aplicaciones web y nativas](/es/docs/authenticate/passwordless/implement-login/embedded-login)

<div id="how-it-works">
  ## Cómo funciona
</div>

Las passkeys nativas usan una combinación de la [API de autenticación de Auth0](/es/docs/authenticate/database-connections/passkeys/native-passkeys-api) y las API nativas de iOS o Android para integrar los flujos de desafío directamente en su aplicación móvil. Esto le permite crear una experiencia integrada de registro e inicio de sesión para su aplicación sin depender de redirigir a los usuarios a través del navegador para completar la autenticación.

El siguiente ejemplo muestra la experiencia que puede tener un usuario nuevo durante el flujo de registro con passkey:

1. Un usuario nuevo abre su aplicación móvil y accede a la pantalla de inicio de sesión. Como es un usuario nuevo, selecciona el botón Registrarse.
2. En la siguiente pantalla, el usuario introduce su correo electrónico y selecciona Crear cuenta.
3. A continuación, se le pregunta al usuario si desea crear una passkey para su aplicación. Para continuar, el usuario selecciona Continuar.
4. Para generar una passkey, el usuario debe autenticarse localmente en su dispositivo mediante biometría u otro método de autenticación, como introducir un PIN.
5. Una vez completada la autenticación local, se guarda una nueva passkey en el dispositivo del usuario y se sincroniza con su proveedor de passkeys, como iCloud o Google.
6. Después de guardar la passkey, el usuario continúa con el proceso de registro para finalizar su cuenta.

Una vez completado este proceso, el usuario podrá autenticarse con su passkey guardada la próxima vez que inicie sesión en su aplicación.

<div id="before-you-begin">
  ## Antes de empezar
</div>

<div id="configure-a-custom-domain">
  ### Configurar un dominio personalizado
</div>

Las passkeys nativas requieren el uso de un <Tooltip tip="Dominio personalizado: dominio de terceros con un nombre especializado o personalizado." cta="Ver glosario" href="/es/docs/glossary?term=custom+domain">dominio personalizado</Tooltip>. Antes de continuar, asegúrate de haber configurado un dominio personalizado para tu Tenant. Para obtener más información, consulta [Dominios personalizados](/es/docs/customize/custom-domains).

<div id="configure-your-passkey-policy">
  ### Configure la política de passkey
</div>

Antes de poder implementar passkey nativas para aplicaciones de Android o iOS, debe configurar una política de passkey en su Tenant de Auth0. Para preparar su Tenant, siga los pasos indicados en [Configurar la política de passkey](/es/docs/authenticate/database-connections/passkeys/configure-passkey-policy).

<div id="prepare-your-application">
  ### Prepare la aplicación
</div>

Para preparar la aplicación para passkeys nativas, debe configurar la configuración del dispositivo y agregar la concesión `Passkey`. Puede completar esta configuración desde su <Tooltip tip="Auth0 Dashboard: el producto principal de Auth0 para configurar sus servicios." cta="Ver glosario" href="/es/docs/glossary?term=Auth0+Dashboard">Auth0 Dashboard</Tooltip> o mediante la <Tooltip tip="Management API: un producto que permite a los clientes realizar tareas administrativas." cta="Ver glosario" href="/es/docs/glossary?term=Management+API">Management API</Tooltip>.

<div id="associated-domains">
  #### Dominios asociados
</div>

Para que los usuarios finales puedan autenticarse con una única passkey en distintos tipos de aplicaciones o en aplicaciones con subdominios diferentes, establezca el Relying Party ID en el dominio raíz o dominio principal. Para obtener más información, consulte [Passkeys](/es/docs/authenticate/database-connections/passkeys).

<div id="configure-auth0-dashboard">
  ### Configura Auth0 Dashboard
</div>

1. Ve a [Applications > Applications](https://manage.auth0.com/#/applications) y selecciona la aplicación que quieres actualizar.
2. En la parte inferior de la pestaña **Settings**, selecciona **Advanced Settings**. Luego, elige la pestaña **Device Settings**.
3. Completa las secciones **iOS** y **Android** según sea necesario para tu aplicación. Luego, haz clic en **Save Changes**.
4. En la sección **Advanced Settings**, selecciona la pestaña **Grant Types**.
5. Habilita la concesión **Passkey** y luego selecciona **Save Changes**.

<div id="management-api">
  #### Management API
</div>

Llame al endpoint [Update a Client](https://auth0.com/docs/api/management/v2/clients/patch-clients-by-id) y:

* Actualice `grant_types` para incluir `urn:okta:params:oauth:grant-type:webauthn`.
* Use el objeto `mobile` para especificar la configuración de los dispositivos iOS y Android según sea necesario.

<div id="implement-passkey-flows">
  ## Implementar flujos con passkeys
</div>

Puede definir los siguientes flujos de passkeys para su aplicación:

* [Flujo de registro](#signup-flow): Permite que los usuarios nuevos generen y guarden una passkey durante el proceso de registro.
* [Flujo de inicio de sesión](#login-flow): Permite que un usuario existente, que ya se haya inscrito en passkeys, se autentique con la passkey guardada durante el proceso de inicio de sesión.

<div id="signup-flow">
  ### Flujo de registro
</div>

Un usuario inicia el flujo de registro con passkey cuando intenta iniciar sesión en su aplicación por primera vez.

Si el usuario proporciona un identificador que ya existe, se recomienda pedirle que complete el flujo de inicio de sesión en su lugar. De lo contrario, la operación fallará.

<div id="flow-steps">
  #### Pasos del flujo
</div>

1. Un usuario visita su aplicación y elige registrar una cuenta nueva. El usuario proporciona un identificador solicitado por la aplicación, como su dirección de correo electrónico.
2. A continuación, la aplicación inicia el desafío de registro llamando al endpoint [Solicitar desafío de registro](/es/docs/authenticate/database-connections/passkeys/native-passkeys-api#request-signup-challenge) de la API de autenticación de Auth0:

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  * Si no especifica un `realm`, se usa el directorio predeterminado de su Tenant.
  * De forma predeterminada, el correo electrónico es el identificador obligatorio. Si ha habilitado [Identificadores flexibles](/es/docs/authenticate/database-connections/activate-and-configure-attributes-for-flexible-identifiers) para su conexión de base de datos, puede usar en su lugar una combinación de `email`, `phone_number` o `username`. Estas opciones pueden ser obligatorias u opcionales y deben coincidir con la configuración de Identificadores flexibles.
</Callout>

```text lines theme={null}
   POST /passkey/register
   Content-Type: application/json

   {
     "client_id": "{YOUR_CLIENT_ID}",
     "realm": "{OPTIONAL_CONNECTION}",
     "user_profile": {
   	  "email": "{VALID_EMAIL_ADDRESS}",
   	  "name": "{OPTIONAL_USER_DISPLAY_NAME}",
     }
   }
```

3. Como respuesta, Auth0 devuelve [`PublicKeyCredentialCreationOptions`](https://www.w3.org/TR/webauthn-3/#dictdef-publickeycredentialcreationoptions) junto con un ID de `auth_session` y `rpId` como `rp.id`:

   ```text lines expandable theme={null}
   HTTP/1.1 200 OK
   Content-Type: application/json

   {
     "authn_params_public_key": {
       "challenge": "{GENERATED_CHALLENGE_FOR_THIS_SESSION}",
       "timeout": {MILLISECONDS},
       "rp": {
         "id": "{YOUR_CUSTOM_DOMAIN}",
         "name": "{YOUR_CUSTOM_DOMAIN}"
       },
       "pubKeyCredParams": [
         { type: 'public-key', alg: -8 },
         { type: 'public-key', alg: -7 },
         { type: 'public-key', alg: -257 }
       ],
       "authenticatorSelection": {
         "residentKey": "required",
         "userVerification": "preferred"
       },
       "user": {
         "id": "{GENERATED_ID}",
         "name": "{USER-ENTERED_IDENTIFIER}",
         "displayName": "{USER-ENTERED_DISPLAY_NAME_OR_IDENTIFIER_IF_MISSING}"
       }
     },
     "auth_session": "{SESSION_ID}"
    }
   ```

   <Callout icon="file-lines" color="#0EA5E9" iconType="regular">
     El `rpId` devuelto en la respuesta coincide con el dominio usado en el flujo web para que las passkeys funcionen en dominios asociados.
   </Callout>

4. A continuación, la aplicación completa el proceso de registro del usuario mediante las API nativas correspondientes:

   * Consulte la [documentación de registro de Android](https://developer.android.com/identity/passkeys/create-passkeys).
   * Consulte la [documentación de registro de iOS](https://developer.apple.com/documentation/authenticationservices/supporting-passkeys#Register-a-new-account-on-a-service).

5. A continuación, la aplicación usa la información de credenciales obtenida durante el proceso de registro, incluidos los detalles de `authn_response`, para llamar al endpoint [Token](/es/docs/authenticate/database-connections/passkeys/native-passkeys-api#authenticate-new-user):

   ```text lines theme={null}
   POST /oauth/token
   Content-Type: application/json

   {
     "grant_type": "urn:okta:params:oauth:grant-type:webauthn",
     "client_id": "{YOUR_CLIENT_ID}",
     "realm": "{OPTIONAL_CONNECTION}",
     "scope": "{OPTIONAL_REQUESTED_SCOPE}",
     "audience": "{OPTIONAL_REQUESTED_AUDIENCE}"
     "auth_session": "{SESSION_ID_FROM_THE_FIRST_REQUEST}",
     "authn_response": {
       "id": "{BASE64URL_ID}",
       "rawId": "{BASE64URL_RAWID}",
       "type": "public-key",
       "authenticatorAttachment": "platform|cross-platform",
       "response": {
         "clientDataJSON": "{BASE64URL_CLIENT_DATA_JSON}",
         "attestationObject": "{BASE64URL_ATTESTATION_OBJECT}",
         {OTHER_PROPERTIES}
       },
     },
   }
   ```

6. Auth0 crea una nueva cuenta de usuario y devuelve los tokens solicitados para completar el flujo:

   ```text lines theme={null}
   HTTP/1.1 200 OK
   Content-Type: application/json

   {
     "access_token": "{BASE64_TOKEN}",
     "refresh_token": "{BASE64_TOKEN}",
     "id_token": "{BASE64_TOKEN}",
     "token_type": "Bearer",
     "expires_in": {SECONDS}
   }
   ```

<div id="login-flow">
  ### Flujo de inicio de sesión
</div>

Un usuario existente inicia el flujo de inicio de sesión con passkeys cuando intenta iniciar sesión en tu aplicación. Este flujo solo se aplica a los usuarios existentes que hayan guardado passkeys en sus cuentas durante el registro inicial.

<div id="flow-steps">
  #### Pasos del flujo
</div>

1. Un usuario abre su aplicación y comienza el proceso de inicio de sesión. A continuación, su aplicación inicia el desafío de inicio de sesión llamando al endpoint [Solicitar desafío de inicio de sesión](/es/docs/authenticate/database-connections/passkeys/native-passkeys-api#request-login-challenge) de la API de autenticación:

   <Callout icon="file-lines" color="#0EA5E9" iconType="regular">
     Si no especifica un `realm`, se usará el directorio predeterminado de su Tenant.
   </Callout>

   ```text lines theme={null}
   POST /passkey/challenge
   Content-Type: application/json

   {
     "client_id": "{YOUR_CLIENT_ID}",
     "realm": "{OPTIONAL_CONNECTION}"
   }
   ```

2. Como respuesta, Auth0 devuelve [`PublicKeyCredentialRequestOptions`](https://www.w3.org/TR/webauthn-3/#dictdef-publickeycredentialrequestoptions) junto con una `auth_session` para continuar el flujo en su aplicación:

   ```text lines theme={null}
   HTTP/1.1 200 OK
   Content-Type: application/json

   {
     "authn_params_public_key": {
       "challenge": "{GENERATED_CHALLENGE_FOR_THIS_SESSION}",
       "timeout": {AUTH_TIMEOUT_IN_MILLISECONDS},
       "rpId": "{CUSTOM_DOMAIN}",
       "userVerification": "preferred"
     },
     "auth_session": "{SESSION_ID}"
   }
   ```

3. A continuación, su aplicación completa el proceso de inicio de sesión mediante las API nativas correspondientes:

   * Consulte la [documentación de inicio de sesión para Android](https://developer.android.com/identity/passkeys/sign-in-with-passkeys)
   * Consulte la [documentación de inicio de sesión para iOS](https://developer.apple.com/documentation/authenticationservices/supporting-passkeys#Connect-to-a-service-with-an-existing-account).

4. A continuación, su aplicación usa la información de credenciales obtenida durante el proceso de inicio de sesión, incluidos los detalles de `authn_response`, para llamar al endpoint [Token](/es/docs/authenticate/database-connections/passkeys/native-passkeys-api#authenticate-existing-user):

   ```text lines theme={null}
   POST /oauth/token
   Content-Type: application/json

   {
     "grant_type": "urn:okta:params:oauth:grant-type:webauthn",
     "client_id": "{YOUR_CLIENT_ID}",
     "realm": "{OPTIONAL_CONNECTION}",
     "scope": "{OPTIONAL_REQUESTED_SCOPE}",
     "audience": "{OPTIONAL_REQUESTED_AUDIENCE}"
     "auth_session": "{SESSION_ID_FROM_THE_FIRST_REQUEST}",
     "authn_response": {
       "id": "{BASE64URL_ID}",
       "rawId": "{BASE64URL_RAWID}",
       "type": "public-key",
       "authenticatorAttachment": "platform|cross-platform",
       "response": {
         "authenticatorData": "{BASE64URL_AUTHENTICATORDATA}",
         "clientDataJSON": "{BASE64URL_CLIENTDATAJSON}",
         "signature": "{BASE64URL_SIGNATURE}",
         "userHandle": "{BASE64URL_USERHANDLE}"
       },
       "clientExtensionResults": {OPTIONAL_OBJECT}
      }
   }
   ```

5. Auth0 autentica las credenciales y devuelve los tokens solicitados para completar el flujo:

   ```text lines theme={null}
   HTTP/1.1 200 OK
   Content-Type: application/json

   {
     "access_token": "{BASE64_TOKEN}",
     "refresh_token": "{BASE64_TOKEN}",
     "id_token": "{BASE64_TOKEN}",
     "token_type": "Bearer",
     "expires_in": {SECONDS}
   }
   ```

<div id="references">
  ## Referencias
</div>

Puede consultar los siguientes recursos al implementar passkeys nativas para su aplicación móvil:

* API de autenticación de Auth0

  * [Solicitar desafío de registro](/es/docs/authenticate/database-connections/passkeys/native-passkeys-api#request-signup-challenge)
  * [Autenticar a un usuario nuevo](/es/docs/authenticate/database-connections/passkeys/native-passkeys-api#authenticate-new-user)
  * [Solicitar desafío de inicio de sesión](/es/docs/authenticate/database-connections/passkeys/native-passkeys-api#request-login-challenge)
  * [Autenticar a un usuario existente](/es/docs/authenticate/database-connections/passkeys/native-passkeys-api#authenticate-existing-user)
* Recursos de Android

  * [Documentación de registro](https://developer.android.com/identity/passkeys/create-passkeys)
  * [Documentación de inicio de sesión](https://developer.android.com/identity/passkeys/sign-in-with-passkeys)
* Recursos de iOS

  * [Documentación de registro](https://developer.apple.com/documentation/authenticationservices/supporting-passkeys#Register-a-new-account-on-a-service)
  * [Documentación de inicio de sesión](https://developer.apple.com/documentation/authenticationservices/supporting-passkeys#Connect-to-a-service-with-an-existing-account)
