SDK de Auth0 para aplicaciones de una sola página: flujo de código de autorización con PKCE.
SDK de Auth0 para aplicaciones de una sola página que usan el flujo de código de autorización con PKCE.
El SDK de Auth0 para aplicaciones de página única es una nueva biblioteca de JavaScript para implementar autenticación y autorización en aplicaciones de página única (SPA) con Auth0. Proporciona una API de alto nivel y se encarga de muchos de los detalles para que puedas proteger las SPA siguiendo prácticas recomendadas y escribiendo menos código.El SDK de Auth0 para SPA gestiona los detalles de concesión y del protocolo, la caducidad y renovación de los tokens, así como su almacenamiento y almacenamiento en caché. Internamente, implementa Universal Login y el flujo de código de autorización con PKCE.La biblioteca y la documentación de la API están alojadas en GitHub.Si encuentras algún problema o error al usar el nuevo SDK de JavaScript, consulta las preguntas frecuentes para ver si tu problema se trata allí.
Tiene varias opciones para usar el SDK de SPA de Auth0 en su proyecto:
Desde el CDN: <script src="https://cdn.auth0.com/js/auth0-spa-js/2.0/auth0-spa-js.production.js"></script>. Para obtener más información, consulte las preguntas frecuentes.
Primero, debes crear una nueva instancia del objeto cliente Auth0Client. Crea la instancia de Auth0Client antes de renderizar o inicializar la aplicación. Puedes hacerlo con el método async/await o con promesas. Solo debes crear una instancia del cliente.Al usar createAuth0Client, se hacen automáticamente un par de cosas:
Se crea una instancia de Auth0Client.
Se llama a getTokenSilently para actualizar la sesión del usuario.
Se suprimen todos los errores de getTokenSilently, excepto login_required.
A continuación, cree un botón en el que los usuarios puedan hacer clic para iniciar sesión:<button id="login">Click to Login</button>Escuche los eventos de clic del botón que creó. Cuando se produzca el evento, use el método de inicio de sesión deseado para autenticar al usuario (loginWithRedirect() en este ejemplo). Después de que el usuario se haya autenticado, puede recuperar su perfil con el método getUser().
Para llamar a tu API, empieza por obtener el del usuario. Luego, usa el Token de acceso en tu solicitud. En este ejemplo, se utiliza el método getTokenSilently para recuperar el Token de acceso:<button id="callApi">Llamar a una API</button>
De forma predeterminada, SDK de SPA de Auth0 almacena los tokens en memoria. Sin embargo, esto no ofrece persistencia entre recargas de página y entre pestañas del navegador. En su lugar, puede optar por almacenar los tokens en el almacenamiento local configurando la propiedad cacheLocation como localstorage al inicializar el SDK. Esto puede ayudar a mitigar algunos de los efectos de las tecnologías de privacidad del navegador que impiden el acceso a la cookie de sesión de Auth0 al almacenar Tokens de acceso durante más tiempo.
Almacenar tokens en el almacenamiento local del navegador ofrece persistencia entre recargas de página y entre pestañas del navegador. Sin embargo, si un atacante logra ejecutar JavaScript en la SPA mediante un ataque de secuencias de comandos entre sitios (XSS), puede recuperar los tokens almacenados en el almacenamiento local. Una vulnerabilidad que permita un ataque XSS exitoso puede estar tanto en el código fuente de la SPA como en cualquier código JavaScript de terceros (como Bootstrap, jQuery o Google Analytics) incluido en la SPA.Obtenga más información sobre el almacenamiento de tokens.
El SDK de SPA de Auth0 puede configurarse para usar Tokens de actualización rotativos para obtener nuevos tokens de acceso de forma silenciosa. Estos pueden usarse para sortear las tecnologías de privacidad del navegador que impiden acceder a la cookie de sesión de Auth0 al autenticar de forma silenciosa, además de ofrecer detección de reutilización integrada.Configure el SDK para ello estableciendo useRefreshTokens en true durante la inicialización: también deberán configurarse para tu inquilino antes de poder usarse en tu SPA.Una vez configurado, el SDK solicitará el scope offline_access durante el proceso de autorización. Además, getTokenSilently llamará directamente al endpoint /oauth/token para intercambiar tokens de actualización por tokens de acceso.
El SDK respetará la configuración de almacenamiento al guardar los tokens de actualización. Si el SDK se configuró con el mecanismo predeterminado de almacenamiento en memoria, los tokens de actualización se perderán al recargar la página.
Si el usuario tarda más del tiempo de espera predeterminado de 60 segundos en completar el flujo de autenticación, la autenticación se interrumpirá y deberá capturar el error en su código para hacer una de estas dos cosas:Sugerir que el usuario vuelva a intentarlo y cerrar manualmente la ventana emergente con error.popup.close:
$('#loginPopup').click(async () => { try { await auth0.loginWithPopup(); } catch {error} if (error instanceof auth0.PopupTimeoutError) { // lógica personalizada para informar al usuario que reintente error.popup.close(); }});
O bien, cree una opción popup personalizada en el objeto options:
$('#loginPopup').click(async () => { const popup = window.open( '', 'auth0:authorize:popup', 'left=100,top=100,width=400,height=600,resizable' ); try { await auth0.loginWithPopup({ popup }); } catch {error} if (error instanceof auth0.PopupTimeoutError) { // lógica personalizada para informar al usuario que reintente error.popup.close(); }});
Obtenga un nuevo Token de acceso de forma silenciosa mediante un iframe oculto y prompt=none, o usando un Token de actualización rotativo. Los Tokens de actualización se usan cuando useRefreshTokens se establece en true al configurar el SDK.
Obtener un Token de acceso de forma silenciosa sin usar Tokens de actualización no funcionará en navegadores que bloquean las cookies de terceros, como Safari y Brave. Para obtener más información sobre la solución alternativa del dominio personalizado, consulte Solucionar problemas al renovar tokens cuando se usa Safari.
Si se usan el almacenamiento en memoria (el valor predeterminado) y los tokens de actualización, los nuevos tokens se obtienen mediante un web worker en los navegadores compatibles:
Obtener un Token de acceso con una ventana emergente
Los Tokens de acceso también se pueden obtener mediante una ventana emergente. A diferencia de getTokenSilently, este método para obtener un Token de acceso funciona en navegadores en los que las cookies de terceros están bloqueadas de forma predeterminada:
Obtener un Token de acceso para una audiencia distinta
Puedes pasar opciones a getTokenSilently para obtener un Token de acceso con una y un scope distintos de los solicitados en el momento de la autenticación del usuario.
Esto solo funciona cuando no se usan Tokens de actualización (useRefreshTokens: false), ya que un Token de actualización está vinculado a la audiencia y al scope específicos que se solicitaron en el momento de la autenticación del usuario.
Puedes obtener los claims del del usuario autenticado mediante el método getIdTokenClaims:
$('#getIdTokenClaims').click(async () => { const claims = await auth0.getIdTokenClaims(); // si necesitas el id_token sin procesar, puedes acceder a él // usando la propiedad __raw const id_token = claims.__raw;});