Files
iam-service/docs/SCALAR_GUIDE.md
2026-01-31 11:11:55 +08:00

6.6 KiB
Raw Blame History

IAM Service — Scalar 调用顺序指南v0.1.0

Authentication认证方式

本服务使用 JWT Bearer Token

  • 登录成功后拿到 access_token
  • 后续请求在 Header 中带:
    • Authorization: Bearer <access_token>
  • 租户上下文:
    • 保护接口默认从 Token claim 的 tenant_id 推导租户
    • 可选兼容 X-Tenant-ID: <uuid>,若同时提供 Header 与 Token则必须一致否则返回 403

访问令牌JWTtenant_id/user_id/roles/permissions 外,还包含:

  • apps:租户已开通应用列表(如 ["cms","tms"]
  • apps_version:租户 enabled_apps 版本号(用于客户端判断是否需要刷新会话)

通用响应结构

成功响应:

{ "code": 0, "message": "Success|Created|Accepted", "data": {}, "trace_id": null }

错误响应(示例):

{ "code": 20006, "message": "Missing authorization header", "details": null, "trace_id": null }

常见错误码(节选):

  • 20006缺少必要 Header如 Authorization
  • 20003无权限403
  • 20005账号或密码错误
  • 30000请求参数错误400
  • 30002资源不存在404
  • 30003资源冲突409
  • 40000请求过于频繁429
  • 10001数据库错误500

Step-by-step可复制流程

Step -1数据库初始化 / 迁移(开发/测试/生产)

本服务新增了“租户已开通应用enabled_apps”与“平台超级管理员SuperAdmin”能力对应数据库新增表

  • apps
  • tenant_entitlements
  • tenant_enabled_apps_history

推荐使用版本化迁移脚本初始化与升级:

  • 执行迁移:scripts/db/migrate.sh
  • 执行校验:scripts/db/verify.sh
  • 回滚(按版本):scripts/db/rollback.sh

本仓库同时保留开发用的一键重建脚本:scripts/db/rebuild_iam_db.sh(会清库重建,不适合生产)。

Step 0创建租户可选

POST /tenants/register

  • Header
  • Body
{ "name": "Tenant A", "config": { "theme": { "primary": "#1d4ed8" } } }

成功201data.id 取出租户 ID

{ "code": 0, "message": "Created", "data": { "id": "<tenant_id>", "name": "Tenant A", "status": "active", "config": {} }, "trace_id": null }

下一步依赖:tenant_id(用于注册/登录时的 X-Tenant-ID)。

Step 0.1:平台超级管理员(可选,但推荐先完成)

数据库已内置平台租户Platform tenant

  • tenant_id = 00000000-0000-0000-0000-000000000001

在平台租户下注册首个用户,将自动获得平台级权限(用于管理各租户 enabled_apps

POST /auth/register

  • HeaderX-Tenant-ID: 00000000-0000-0000-0000-000000000001
  • Body
{ "email": "superadmin@example.com", "password": "securePassword123" }

Step 1注册用户

POST /auth/register

  • 必需 HeaderX-Tenant-ID: <tenant_id>
  • Body
{ "email": "user@example.com", "password": "securePassword123" }

成功201data.id 取出 user_id(后续可用于用户管理接口):

{ "code": 0, "message": "Created", "data": { "id": "<user_id>", "email": "user@example.com" }, "trace_id": null }

Step 2登录获取访问令牌Authentication 入口)

POST /auth/login

  • 必需 HeaderX-Tenant-ID: <tenant_id>
  • Body
{ "email": "user@example.com", "password": "securePassword123" }

成功200data.access_token 取出访问令牌:

{ "code": 0, "message": "Success", "data": { "access_token": "<jwt>", "refresh_token": "<opaque>", "token_type": "Bearer", "expires_in": 900 }, "trace_id": null }

下一步依赖:access_token

Step 3获取当前租户信息Tenant

GET /tenants/me

  • 必需 HeaderAuthorization: Bearer <access_token>
  • 可选 HeaderX-Tenant-ID: <tenant_id>(如提供必须与 token tenant_id 一致)

成功200

{ "code": 0, "message": "Success", "data": { "id": "<tenant_id>", "name": "Tenant A", "status": "active", "config": {} }, "trace_id": null }

Step 4查看当前用户权限Me

GET /me/permissions

  • 必需 HeaderAuthorization: Bearer <access_token>

成功200

{ "code": 0, "message": "Success", "data": ["tenant:read","tenant:write"], "trace_id": null }

下一步依赖:确认具备目标权限(例如 user:read / role:read)。

Step 4.1平台层设置租户已开通应用SuperAdmin

该能力仅允许拥有平台级权限的用户调用:

  • iam:tenant:enabled_apps:read
  • iam:tenant:enabled_apps:write

4.1.1 查询某租户 enabled_apps

GET /platform/tenants/{tenant_id}/enabled-apps

  • HeaderAuthorization: Bearer <access_token>(平台租户下登录得到的 token

4.1.2 设置某租户 enabled_apps全量覆盖幂等

PUT /platform/tenants/{tenant_id}/enabled-apps

  • HeaderAuthorization: Bearer <access_token>
  • Body
{ "enabled_apps": ["cms", "tms"], "expected_version": 0 }

说明:

  • expected_version 可选,用于并发控制;不匹配会返回 409。
  • 登录签发 token 时会自动把 apps/apps_version 注入到 JWT并对 permissions 按 enabled_apps 过滤。

Step 5列出用户User

GET /users?page=1&page_size=20

  • 必需 HeaderAuthorization: Bearer <access_token>
  • 分页规则:
    • page 默认 1必须 >= 1
    • page_size 默认 20范围 1..=200

成功200

{ "code": 0, "message": "Success", "data": [{ "id": "<user_id>", "email": "user@example.com" }], "trace_id": null }

Step 6列出角色Role

GET /roles

  • 必需 HeaderAuthorization: Bearer <access_token>

成功200

{ "code": 0, "message": "Success", "data": [{ "id": "<role_id>", "name": "Admin", "description": "..." }], "trace_id": null }

Step 7用户-角色绑定User

用户注册后默认无角色;通常由具备 user:write 的管理员进行角色分配。

7.1 查询用户角色列表(需要 user:read

GET /users/{id}/roles

  • HeaderAuthorization: Bearer <access_token>

7.2 设置用户角色(全量覆盖,幂等;需要 user:write

PUT /users/{id}/roles

  • HeaderAuthorization: Bearer <access_token>
  • Body
{ "role_ids": ["<role_id_1>", "<role_id_2>"] }

说明:

  • role_ids 必须全部属于当前租户,否则返回 400。

限流说明Auth

  • /auth/login:约 2 req/sburst 10同一 IP
  • /auth/register:约 1 req/sburst 5同一 IP
  • 触发后返回HTTP 429 + code=40000