จัดการผู้เช่า (tenant) อัตโนมัติ
คุณสามารถจัดการผู้เช่า Logto Cloud แบบโปรแกรมมิ่งได้ รวมถึงการสร้างผู้เช่าและดำเนินการตั้งค่าต่อโดยไม่ต้องสลับไปที่ Console
สิ่งนี้มีประโยชน์เมื่อคุณต้องการจัดเตรียมผู้เช่าจากกระบวนการ onboarding ของคุณเอง แพลตฟอร์มภายใน เอเจนต์ AI หรือระบบอัตโนมัติแบบบูรณาการ
ขั้นตอนการอัตโนมัติคือ:
- ใช้ Logto Cloud Personal Access Token (PAT) เพื่อเรียก Logto Cloud API
- สร้างผู้เช่าด้วย
POST /api/tenants - อ่านข้อมูลรับรองแอป Machine-to-machine (M2M) เริ่มต้นจากผลลัพธ์การสร้าง
- ใช้แอป M2M เริ่มต้นเพื่อขอรับโทเค็นการเข้าถึง Management API สำหรับผู้เช่าใหม่
- เรียก Management API ของผู้เช่าใหม่เพื่อดำเนินการ provisioning แอปพลิเคชัน ผู้ใช้ บทบาท ทรัพยากร องค์กร และการตั้งค่าอื่น ๆ ต่อไป
สร้าง PAT
สร้าง personal access token (PAT) สำหรับบัญชี Logto Cloud ของคุณ:
- ใน Logto Cloud Console คลิกอวาตาร์ของคุณที่มุมขวาบนและเลือก โปรไฟล์
- เปิดหน้า ความปลอดภัย
- ใน Personal access tokens คลิก สร้างโทเค็นใหม่
- กรอกชื่อและเลือกวันหมดอายุสูงสุด 365 วัน จากนั้นยืนยัน
โทเค็นจะแสดงเพียงครั้งเดียวหลังจากที่คุณสร้างเท่านั้น คัดลอกและเก็บไว้ในที่ปลอดภัย เช่น secret manager คุณจะไม่สามารถดูมันได้อีก
แนะนำให้ตั้งวันหมดอายุ 90 วันและหมุนเวียนโทเค็นก่อนหมดอายุ คุณสามารถเปลี่ยนชื่อหรือเพิกถอนโทเค็นได้ในหน้าเดียวกัน
การเพิกถอนโทเค็นจะมีผลภายในประมาณหนึ่งนาที
PAT สามารถเรียก Cloud API routes ที่ต้องการขอบเขต create:tenant หรือ manage:tenant:self ได้:
GET /api/me/regionsเพื่อดูรายการภูมิภาคที่บัญชีของคุณใช้งานได้POST /api/tenantsเพื่อสร้างผู้เช่าGET /api/tenantsเพื่อดูรายการผู้เช่าของคุณ และPATCHหรือDELETE /api/tenants/{tenantId}เพื่อเปลี่ยนชื่อหรือ ลบผู้เช่าPOST /api/tenants/{tenantId}/subscriptionและ endpoints อื่น ๆ ภายใต้/api/tenants/{tenantId}เพื่อจัดการแผนผู้เช่า ใบแจ้งหนี้ และบันทึกอีเมล
Routes ที่ต้องการขอบเขต manage:account:self เช่น การเรียกเก็บเงิน ใบอนุญาต และ Console SSO ต้องใช้ session แบบ interactive ใน Console และไม่สามารถเรียกด้วย PAT ได้
ก่อนเริ่มต้น
เตรียมค่าต่อไปนี้:
| ตัวแปร | คำอธิบาย |
|---|---|
CLOUD_API_ENDPOINT | จุดปลาย Logto Cloud API สำหรับ Logto Cloud ใช้ https://cloud.logto.io |
LOGTO_CLOUD_PAT | PAT สำหรับบัญชี Logto Cloud ของคุณ |
TENANT_NAME | ชื่อที่จะแสดงของผู้เช่าที่จะสร้าง |
TENANT_TAG | ประเภทของผู้เช่า ใช้ development หรือ production |
REGION_NAME | ตัวระบุภูมิภาคสำหรับผู้เช่า |
ตั้งค่าตัวแปรเหล่านี้เป็น environment variables:
export CLOUD_API_ENDPOINT="https://cloud.logto.io"
export LOGTO_CLOUD_PAT="<logto-cloud-pat>"
export TENANT_NAME="My automated tenant"
export TENANT_TAG="development"
export REGION_NAME="<region-name>"
ดูภูมิภาคที่ใช้งานได้
ก่อนสร้างผู้เช่า ให้ดึงรายการภูมิภาคที่บัญชี Logto Cloud ของคุณใช้งานได้:
curl "$CLOUD_API_ENDPOINT/api/me/regions" \
-H "Authorization: Bearer $LOGTO_CLOUD_PAT"
ผลลัพธ์จะมีรายการภูมิภาคที่ใช้งานได้ ใช้ค่าของ name เป็น REGION_NAME ตอนสร้างผู้เช่า
ตัวอย่างผลลัพธ์:
{
"regions": [
{
"name": "EU",
"displayName": "Europe"
},
{
"name": "US",
"displayName": "United States"
}
]
}
สร้างผู้เช่า
เรียก POST /api/tenants ด้วย 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"'"
}'
ผลลัพธ์จะมีข้อมูลผู้เช่าที่สร้างและแอป M2M เริ่มต้น แอป M2M นี้ถูกสร้างในผู้เช่าใหม่และมีสิทธิ์เข้าถึง Management API ของผู้เช่า
ตัวอย่างผลลัพธ์:
{
"id": "new-tenant-id",
"name": "My automated tenant",
"tag": "development",
"indicator": "https://new-tenant-id.logto.app",
"regionName": "EU",
"defaultApplication": {
"id": "default-m2m-app-id",
"secret": "default-m2m-app-secret"
}
}
บันทึกค่าที่ต้องใช้ในขั้นตอนถัดไป:
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>"
ผู้เช่าที่สร้างด้วย tag: "production" จะเริ่มต้นที่แผน Free หากต้องการเปลี่ยนเป็นแผน Pro จากสคริปต์เดียวกัน ดู สมัครสมาชิกแผน Pro ให้ผู้เช่า ผู้เช่าแบบ development เช่นตัวอย่างนี้ ไม่สามารถสมัครผ่าน API ได้
ขอรับโทเค็นการเข้าถึง Management API สำหรับผู้เช่าใหม่
ใช้ข้อมูลรับรองแอป M2M เริ่มต้นเพื่อขอโทเค็นการเข้าถึงจากผู้เช่าใหม่:
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"
ตัวอย่างผลลัพธ์:
{
"access_token": "eyJ...",
"expires_in": 3600,
"token_type": "Bearer",
"scope": "all"
}
บันทึก access token:
export MANAGEMENT_API_ACCESS_TOKEN="<response.access_token>"
ดำเนินการ provisioning ผู้เช่าใหม่ต่อ
ใช้ Management API access token เพื่อเรียก Management API ของผู้เช่าใหม่
ตัวอย่าง ดูรายการแอปพลิเคชัน:
curl "$TENANT_ENDPOINT/api/applications" \
-H "Authorization: Bearer $MANAGEMENT_API_ACCESS_TOKEN"
หรือสร้างแอปพลิเคชัน:
curl "$TENANT_ENDPOINT/api/applications" \
-X POST \
-H "Authorization: Bearer $MANAGEMENT_API_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "My web app",
"type": "SPA",
"oidcClientMetadata": {
"redirectUris": ["https://example.com/callback"],
"postLogoutRedirectUris": ["https://example.com"]
}
}'
ในจุดนี้ ระบบอัตโนมัติของคุณสามารถดำเนินการกับ Management API ใด ๆ ต่อได้ เช่น การสร้างผู้ใช้ แอปพลิเคชัน ทรัพยากร API บทบาท องค์กร ตัวเชื่อมต่อ หรือการตั้งค่าประสบการณ์การลงชื่อเข้าใช้
ตัวอย่างอัตโนมัติเต็มรูปแบบ
ตัวอย่าง Node.js ต่อไปนี้จะสร้างผู้เช่า แลกเปลี่ยนข้อมูลรับรอง M2M เริ่มต้นที่ได้มาเป็น Management API access token และดูรายการแอปพลิเคชันในผู้เช่าใหม่:
const cloudApiEndpoint = 'https://cloud.logto.io';
const logtoCloudPat = process.env.LOGTO_CLOUD_PAT;
const createTenantResponse = await fetch(`${cloudApiEndpoint}/api/tenants`, {
method: 'POST',
headers: {
authorization: `Bearer ${logtoCloudPat}`,
'content-type': 'application/json',
},
body: JSON.stringify({
name: 'My automated tenant',
tag: 'development',
regionName: 'EU',
}),
});
if (!createTenantResponse.ok) {
throw new Error(`Failed to create tenant: ${await createTenantResponse.text()}`);
}
const tenant = await createTenantResponse.json();
const tenantEndpoint = tenant.indicator;
const { id: appId, secret: appSecret } = tenant.defaultApplication;
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(`Failed to get Management API token: ${await tokenResponse.text()}`);
}
const { access_token: managementApiAccessToken } = await tokenResponse.json();
const applicationsResponse = await fetch(`${tenantEndpoint}/api/applications`, {
headers: {
authorization: `Bearer ${managementApiAccessToken}`,
},
});
if (!applicationsResponse.ok) {
throw new Error(`Failed to list applications: ${await applicationsResponse.text()}`);
}
const applications = await applicationsResponse.json();
console.log({ tenantId: tenant.id, applications });