Files
AgentLab/frontend/src/api/accessKeys.ts
T
ThearchyHelios 0b825f40ee 设置里的「访问密钥」与钩子的收件记录(下一轮第 2 波 W2-d 前端,细案 04 A1、A6、A7)
- 设置 → 访问密钥:管理员看个人访问密钥的开关、服务账号(建、停用前确认)和全部密钥;别人只看自己的个人访问密钥,管理员
  打开开关之后才有这一页(认人接口多给一项 personal_keys:关着时建不了、已有的也不生效,给一页空的没有用)。新建时缺省只勾读
  的权限,服务账号勾不了回复待办,有效期必填最长 365 天;明文只显示这一次,点「我已保存」就没了;轮换、撤销先确认;关登录时
  照实说访问密钥不生效、不给建的入口
- 「最近的请求」做成共用组件(components/RecentRequests.tsx):每把密钥的请求记录、钩子的收件记录都用它,接口写路由模板,
  成功、被拒、处理中分开上色
- 接口说明:照服务端门禁那张表列出方法、路径、权限、说明、错误码,标出要幂等键的
- 应用编辑 → 钩子:生成过密钥的钩子能展开收件记录(状态、原因、发起的实例),写明近 1 小时验签失败几次
- 名录里的服务账号:选人控件缺省不收(岗位绑定、改派不能派给它),应用授权照收;身份页那一行标出服务账号,不给角色和密码的
  控件;审计按「访问密钥」筛
- 检查:新建 check-access-keys(不叫 check-tokens,那个名字查的是设计令牌),check-app-editor 的钩子一段加收件记录;登记进
  check-all
2026-10-16 14:11:30 +08:00

33 lines
2.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 访问密钥与服务账号(/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),
}