Saltar al contenido principal

Automatiza la gestión de inquilinos

Puedes gestionar los inquilinos de Logto Cloud de forma programática, incluyendo la creación de inquilinos y la continuación de la configuración sin cambiar a la Consola.

Esto es útil cuando necesitas aprovisionar inquilinos desde tu propio flujo de incorporación, plataforma interna, agente de IA o automatización de integraciones.

El flujo de automatización es:

  1. Usa un Logto Cloud Personal Access Token (PAT) para llamar a la API de Logto Cloud.
  2. Crea un inquilino con POST /api/tenants.
  3. Lee las credenciales predeterminadas de la aplicación máquina a máquina (M2M) de la respuesta de creación.
  4. Usa la aplicación M2M predeterminada para obtener un token de acceso de la Management API para el nuevo inquilino.
  5. Llama a la Management API del nuevo inquilino para continuar aprovisionando aplicaciones, usuarios, roles, recursos, organizaciones y otros ajustes.

Antes de comenzar​

Prepara los siguientes valores:

VariableDescripción
CLOUD_API_ENDPOINTEl endpoint de la API de Logto Cloud. Para Logto Cloud, usa https://cloud.logto.io.
LOGTO_CLOUD_PATUn PAT para tu cuenta de Logto Cloud.
TENANT_NAMEEl nombre visible del inquilino a crear.
TENANT_TAGEl tipo de inquilino. Usa development o production.
REGION_NAMEEl identificador de la región para el inquilino.

Establécelos como variables de entorno:

export CLOUD_API_ENDPOINT="https://cloud.logto.io"
export LOGTO_CLOUD_PAT="<logto-cloud-pat>"
export TENANT_NAME="Mi inquilino automatizado"
export TENANT_TAG="development"
export REGION_NAME="<region-name>"

Obtener regiones disponibles​

Antes de crear un inquilino, obtén las regiones disponibles para tu cuenta de Logto Cloud:

curl "$CLOUD_API_ENDPOINT/api/me/regions" \
-H "Authorization: Bearer $LOGTO_CLOUD_PAT"

La respuesta contiene las regiones disponibles. Usa el valor name como REGION_NAME al crear el inquilino.

Ejemplo de respuesta:

{
"regions": [
{
"name": "EU",
"displayName": "Europe"
},
{
"name": "US",
"displayName": "United States"
}
]
}

Crear un inquilino​

Llama a POST /api/tenants con el Logto Cloud PAT:

curl "$CLOUD_API_ENDPOINT/api/tenants" \
-X POST \
-H "Authorization: Bearer $LOGTO_CLOUD_PAT" \
-H "Content-Type: application/json" \
-d '{
"name": "'"$TENANT_NAME"'",
"tag": "'"$TENANT_TAG"'",
"regionName": "'"$REGION_NAME"'"
}'

La respuesta incluye el inquilino creado y una aplicación M2M predeterminada. La aplicación M2M se crea en el nuevo inquilino y tiene acceso a la Management API del inquilino.

Ejemplo de respuesta:

{
"id": "new-tenant-id",
"name": "Mi inquilino automatizado",
"tag": "development",
"indicator": "https://new-tenant-id.logto.app",
"regionName": "EU",
"defaultApplication": {
"id": "default-m2m-app-id",
"secret": "default-m2m-app-secret"
}
}

Guarda los valores que necesitas para el siguiente paso:

export TENANT_ID="<response.id>"
export TENANT_ENDPOINT="<response.indicator>"
export DEFAULT_M2M_APP_ID="<response.defaultApplication.id>"
export DEFAULT_M2M_APP_SECRET="<response.defaultApplication.secret>"

Obtener un token de acceso de la Management API para el nuevo inquilino​

Usa las credenciales de la aplicación M2M predeterminada para solicitar un token de acceso del nuevo inquilino:

curl "$TENANT_ENDPOINT/oidc/token" \
-X POST \
-u "$DEFAULT_M2M_APP_ID:$DEFAULT_M2M_APP_SECRET" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "resource=$TENANT_ENDPOINT/api" \
-d "scope=all"

Ejemplo de respuesta:

{
"access_token": "eyJ...",
"expires_in": 3600,
"token_type": "Bearer",
"scope": "all"
}

Guarda el token de acceso:

export MANAGEMENT_API_ACCESS_TOKEN="<response.access_token>"

Continúa aprovisionando el nuevo inquilino​

Usa el token de acceso de la Management API para llamar a la Management API del nuevo inquilino.

Por ejemplo, listar aplicaciones:

curl "$TENANT_ENDPOINT/api/applications" \
-H "Authorization: Bearer $MANAGEMENT_API_ACCESS_TOKEN"

O crear una aplicación:

curl "$TENANT_ENDPOINT/api/applications" \
-X POST \
-H "Authorization: Bearer $MANAGEMENT_API_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Mi aplicación web",
"type": "SPA",
"oidcClientMetadata": {
"redirectUris": ["https://example.com/callback"],
"postLogoutRedirectUris": ["https://example.com"]
}
}'

En este punto, tu automatización puede continuar con cualquier operación de la Management API, como crear usuarios, aplicaciones, recursos de API, roles, organizaciones, conectores o ajustes de la experiencia de inicio de sesión.

Ejemplo de automatización completa​

El siguiente ejemplo en Node.js crea un inquilino, intercambia las credenciales M2M predeterminadas devueltas por un token de acceso de la Management API y lista las aplicaciones en el nuevo inquilino:

const cloudApiEndpoint = 'https://cloud.logto.io';
const logtoCloudPat = process.env.LOGTO_CLOUD_PAT;

// Crear el inquilino
const createTenantResponse = await fetch(`${cloudApiEndpoint}/api/tenants`, {
method: 'POST',
headers: {
authorization: `Bearer ${logtoCloudPat}`,
'content-type': 'application/json',
},
body: JSON.stringify({
name: 'Mi inquilino automatizado',
tag: 'development',
regionName: 'EU',
}),
});

if (!createTenantResponse.ok) {
throw new Error(`No se pudo crear el inquilino: ${await createTenantResponse.text()}`);
}

const tenant = await createTenantResponse.json();
const tenantEndpoint = tenant.indicator;
const { id: appId, secret: appSecret } = tenant.defaultApplication;

// Obtener el token de la Management API
const tokenResponse = await fetch(`${tenantEndpoint}/oidc/token`, {
method: 'POST',
headers: {
authorization: `Basic ${Buffer.from(`${appId}:${appSecret}`).toString('base64')}`,
'content-type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams({
grant_type: 'client_credentials',
resource: `${tenantEndpoint}/api`,
scope: 'all',
}),
});

if (!tokenResponse.ok) {
throw new Error(
`No se pudo obtener el token de la Management API: ${await tokenResponse.text()}`
);
}

const { access_token: managementApiAccessToken } = await tokenResponse.json();

// Listar aplicaciones
const applicationsResponse = await fetch(`${tenantEndpoint}/api/applications`, {
headers: {
authorization: `Bearer ${managementApiAccessToken}`,
},
});

if (!applicationsResponse.ok) {
throw new Error(`No se pudieron listar las aplicaciones: ${await applicationsResponse.text()}`);
}

const applications = await applicationsResponse.json();

console.log({ tenantId: tenant.id, applications });