SDK de JavaScript para navegador

@keenauth/js es el núcleo para navegador de KeenAuth. Permite que los usuarios inicien sesión en su aplicación de una sola página, conserva sus tokens y realiza llamadas a su API. No tiene dependencias de tiempo de ejecución, y los componentes de React se basan en él. El paquete todavía no está publicado en npm.

Iniciar sesión con redirección

El SDK es un cliente público estándar de OpenID Connect:

import { KeenAuth } from "@keenauth/js";

const auth = new KeenAuth({
  issuer: "https://acme.eu.keenauth.app", // your environment's issuer, exactly
  clientId: "app_01j9zzzzzzzzzzzzzzzzzzzz",
  redirectUri: "https://app.acme.example/callback",
  postLogoutRedirectUri: "https://app.acme.example/",
});

// On your sign-in button:
await auth.signInRedirect({ appState: "/orders" });

// On https://app.acme.example/callback:
const { appState } = await auth.handleRedirectCallback();

handleRedirectCallback acepta una respuesta solo una vez. Falla con un KeenAuthError cuando:

Un error que envía el servidor se lanza como KeenAuthOAuthError con el código error de OAuth.

Llamar a su API

Para obtener un access token para su API, pase su identificador como resource (RFC 8707). Se envía en la solicitud de autorización, en el intercambio del código y en cada renovación, y el aud del token es ese identificador:

const auth = new KeenAuth({
  issuer: "https://acme.eu.keenauth.app",
  clientId: "app_01j9zzzzzzzzzzzzzzzzzzzz",
  redirectUri: "https://app.acme.example/callback",
  resource: "https://api.acme.example", // your API's identifier
  scope: "openid profile email offline_access messages:read",
});
const res = await auth.authorizedFetch("https://api.acme.example/v1/orders");

// Or take the token yourself; it is refreshed when it is about to expire.
const token = await auth.getAccessToken();

authorizedFetch envía Authorization: DPoP con una prueba nueva vinculada al token. Si el servidor solicita un nonce de DPoP, reintenta una vez con ese nonce. Las llamadas concurrentes comparten una única solicitud de renovación, y cada renovación rota el refresh token. Para verificar estos tokens en su API, consulte Verificación de tokens en su API.

Cerrar sesión

await auth.signOut();

signOut elimina los tokens y revoca el refresh token. Después envía el navegador al endpoint de cierre de sesión de su entorno, que lo devuelve a postLogoutRedirectUri.

Dónde se guardan los tokens

Inicio de sesión integrado

El mismo objeto también proporciona a los componentes integrados un cliente de API frontal:

Estas llamadas usan las cookies de su entorno y una cabecera CSRF. El servidor solo las acepta desde el propio origen de inicio de sesión del entorno.

Iniciar sesión sin redirección

En una página fuera de su origen de inicio de sesión, inicie la transacción con su clientId. El SDK la vincula entonces a su clave DPoP en lugar de a cookies:

let tx = await auth.transactions.create({ client_id: "app_01j9...", organization: "acme" });
tx = await auth.transactions.step("identifier", { identifier: "ada@acme.example" });
tx = await auth.transactions.step("password", { password });
if (tx.state === "completed") await auth.complete(tx); // { kind: "signed_in" }

Llamadas de cuenta desde su propio origen

Una vez que el usuario ha iniciado sesión y el SDK tiene un refresh token (el ámbito predeterminado solicita offline_access), las llamadas me y organizations ya no necesitan la cookie de sesión del host de inicio de sesión:

Consulte Access token de la API frontal para las reglas del servidor.

Cambiar de organización

organizations.switch(orgId) cambia al usuario que ha iniciado sesión a otra organización sin cargar una página. Pase el ID org_… de una organización obtenida de organizations.listMine():

const { data } = await auth.organizations.listMine();
await auth.organizations.switch(data[1].id);

Límites actuales