使用 Okta 为自定义开发者门户配置 SCIM 预配
SCIM(跨域身份管理系统)让 Okta 可以在基于 API7 Developer Portal Boilerplate 的自定义开发者门户中预配和更新身份。该集成会添加服务端插件和数据库 schema;它不是一项用于在官方前端镜像中启用端点的设置。
预配身份不会自动创建门户组织成员关系,也不会授予 API 产品访问权限。在使用 SCIM 管理开发者访问权限之前,请将预配生命周期与应用程序的授权模型集成。
前置条件
- 你的自定义开发者门户通过 API7 Developer Portal Boilerplate 部署。
- 你已配置门户并可以访问其身份认证路由。
- 你拥有具有管理权限的 Okta 账户。
以下流程面向使用 Better Auth 1.7.1 的 Boilerplate v0.15.3。选择其他 SCIM 插件版本前,请检查应用程序锁定的 Better Auth 版本。
在 Okta 中创建 SCIM 应用程序
在修改门户代码之前,请在 Okta 中创建 SCIM 应用程序。
- 登录 Okta Admin Console。
- 转到 Applications -> Applications。
- 单击 Browse App Catalog。
- 搜索
SCIM。 - 选择 SCIM 2.0 Test App (Header Auth)。
- 单击 Add Integration。
- 在 General Settings 中,为应用命名,例如
API7 Portal。 - 在 Sign-On Options 中,选择 Secure Web Authentication (SWA)。
- 单击 Done。



安装 SCIM 插件并创建凭据
从 Boilerplate 工作区根目录将 SCIM 插件添加到站点软件包:
pnpm --filter @api7ee/site add @better-auth/scim@1.7.1
生成一个不输出到终端的不透明预配 Token:
export SCIM_TOKEN="$(openssl rand -hex 32)"
在生成 schema 和运行应用程序时保持该值可用。将它存储在部署的密钥管理器中,并在 Okta 中配置为相同的预配凭据。不要将它提交到源代码管理系统。
在门户代码中注册插件
在 apps/site/src/lib/auth/server.ts 中,将 SCIM 插件添加到现有服务端配置。保留应用程序中的其他插件和钩子。SCIM 插件要求事务支持,因此还需要在现有 Drizzle 适配器上启用事务:
import { scim } from '@better-auth/scim';
const scimToken = process.env.SCIM_TOKEN;
if (!scimToken) {
throw new Error('SCIM_TOKEN is required');
}
export const auth = betterAuth({
// 保留其他现有的 Better Auth 选项。
database: drizzleAdapter(db, {
provider: 'pg',
usePlural: true,
transaction: true,
}),
plugins: [
// 在此处保留现有插件。
scim({
connections: [{
id: 'okta',
credentials: [{
type: 'bearer',
id: 'okta-primary',
token: scimToken,
scopes: ['scim.users.read', 'scim.users.write'],
}],
}],
}),
],
});
SCIM 1.7.1 在连接上声明凭据。它不提供浏览器端 scimClient 插件或 generateSCIMToken API。用户读取和写入 scope 支持下方的用户预配流程;组预配需要单独的 scope 和应用程序集成。
检查路由处理程序
apps/site/src/routes/api/auth/$.ts 中的 TanStack Start 处理程序已经将 GET、POST、PUT、PATCH 和 DELETE 委托给 auth.handler。请保留该处理程序,不要添加 Next.js 路由或使用 toNextJsHandler。
应用数据库迁移
SCIM 插件需要额外的数据库表。
cd apps/site
pnpm dlx auth@1.7.1 generate \
--config ./src/lib/auth/server.ts \
--output ./src/lib/db/schema.ts
pnpm db:generate
pnpm db:migrate