mirror of
https://github.com/ThearchyHelios/AgentLab.git
synced 2026-11-15 03:01:58 +00:00
0b825f40ee
- 设置 → 访问密钥:管理员看个人访问密钥的开关、服务账号(建、停用前确认)和全部密钥;别人只看自己的个人访问密钥,管理员 打开开关之后才有这一页(认人接口多给一项 personal_keys:关着时建不了、已有的也不生效,给一页空的没有用)。新建时缺省只勾读 的权限,服务账号勾不了回复待办,有效期必填最长 365 天;明文只显示这一次,点「我已保存」就没了;轮换、撤销先确认;关登录时 照实说访问密钥不生效、不给建的入口 - 「最近的请求」做成共用组件(components/RecentRequests.tsx):每把密钥的请求记录、钩子的收件记录都用它,接口写路由模板, 成功、被拒、处理中分开上色 - 接口说明:照服务端门禁那张表列出方法、路径、权限、说明、错误码,标出要幂等键的 - 应用编辑 → 钩子:生成过密钥的钩子能展开收件记录(状态、原因、发起的实例),写明近 1 小时验签失败几次 - 名录里的服务账号:选人控件缺省不收(岗位绑定、改派不能派给它),应用授权照收;身份页那一行标出服务账号,不给角色和密码的 控件;审计按「访问密钥」筛 - 检查:新建 check-access-keys(不叫 check-tokens,那个名字查的是设计令牌),check-app-editor 的钩子一段加收件记录;登记进 check-all
33 lines
2.0 KiB
TypeScript
33 lines
2.0 KiB
TypeScript
/**
|
||
* 访问密钥与服务账号(/api/access-keys,docs/design/next-round/04-对外集成与触达.md A1–A7),挂在 api.accessKeys 上。形状见
|
||
* typesApp.ts。密钥明文只在建、轮换的回包里(key)出现一次,之后哪个接口都拿不到。
|
||
*/
|
||
import type {
|
||
AccessKeyIssued, AccessKeyReference, AccessKeyRequestRow, AccessKeyRow, AccessKeyScope, AccessKeySettings,
|
||
ServiceAccountRow,
|
||
} from '../typesApp'
|
||
import { get, patch, post, put } from './http'
|
||
|
||
const at = (id: string) => `/access-keys/${encodeURIComponent(id)}`
|
||
|
||
export const accessKeys = {
|
||
settings: () => get<AccessKeySettings>('/access-keys/settings'),
|
||
/** 个人访问密钥的开关(只给管理员) */
|
||
setPersonalKeys: (personal_keys: boolean) => put<AccessKeySettings>('/access-keys/settings', { personal_keys }),
|
||
/** 管理员:全部密钥;别人:自己的 */
|
||
list: async (): Promise<AccessKeyRow[]> => (await get<{ items: AccessKeyRow[] }>('/access-keys')).items,
|
||
/** 不给 service_account_id 是建自己的个人访问密钥 */
|
||
create: (body: { name: string; scopes: AccessKeyScope[]; app_ids?: string[] | null; expires_in_days: number;
|
||
service_account_id?: string }) => post<AccessKeyIssued>('/access-keys', body),
|
||
revoke: (id: string) => post<AccessKeyRow>(`${at(id)}/revoke`),
|
||
rotate: (id: string) => post<AccessKeyIssued>(`${at(id)}/rotate`),
|
||
requests: (id: string) => get<{ items: AccessKeyRequestRow[]; retain_days: number }>(`${at(id)}/requests`),
|
||
reference: () => get<AccessKeyReference>('/access-keys/reference'),
|
||
serviceAccounts: async (): Promise<ServiceAccountRow[]> =>
|
||
(await get<{ items: ServiceAccountRow[] }>('/access-keys/service-accounts')).items,
|
||
createServiceAccount: (body: { username: string; display_name?: string }) =>
|
||
post<ServiceAccountRow>('/access-keys/service-accounts', body),
|
||
updateServiceAccount: (id: string, body: { display_name?: string; disabled?: boolean }) =>
|
||
patch<ServiceAccountRow>(`/access-keys/service-accounts/${encodeURIComponent(id)}`, body),
|
||
}
|