@h-ai/iam 0.1.0-alpha.67 → 0.1.0-alpha.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +55 -30
- package/README.ja.md +56 -31
- package/README.md +57 -32
- package/dist/browser.d.ts +2320 -0
- package/dist/browser.js +3 -0
- package/dist/browser.js.map +1 -0
- package/dist/chunk-VCE74BFW.js +243 -0
- package/dist/chunk-VCE74BFW.js.map +1 -0
- package/dist/index.d.ts +19 -1623
- package/dist/index.js +789 -1173
- package/dist/index.js.map +1 -1
- package/package.json +12 -9
package/dist/index.d.ts
CHANGED
|
@@ -1,1636 +1,32 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
1
|
+
import { IamFunctions } from './browser.js';
|
|
2
|
+
export { AgreementConfig, AgreementConfigSchema, AgreementDisplay, ApiKey, ApiKeyConfig, ApiKeyConfigSchema, ApiKeyCredentials, ApiKeyOperations, ApiKeySortDirection, ApiKeySortField, AuthResult, AuthStrategy, AuthStrategyType, AuthStrategyTypeSchema, AuthUiConfig, AuthUiConfigSchema, AuthnOperations, AuthzOperations, ConsumeTicketOptions, ConsumedTicket, CreateApiKeyOptions, CreateApiKeyResult, CreateSessionOptions, Credentials, HaiIamError, IamConfig, IamConfigInput, IamConfigSchema, IamConfigSettingsInput, IamNotificationContext, IamPublicConfig, IssueTicketOptions, IssuedTicket, LdapClientFactory, LdapConfig, LdapConfigSchema, LdapCredentials, ListApiKeysOptions, ListUsersOptions, LoginConfig, LoginConfigSchema, OtpConfig, OtpConfigSchema, OtpCredentials, PasswordConfig, PasswordConfigSchema, PasswordCredentials, PasswordResetConfig, PasswordResetConfigSchema, Permission, PermissionQueryOptions, PermissionType, RbacConfig, RbacConfigSchema, RegisterConfig, RegisterConfigSchema, RegisterOptions, RegisterResult, Role, SecurityConfig, SecurityConfigSchema, Session, SessionConfig, SessionConfigSchema, SessionData, SessionFieldUpdates, SessionOperations, StoredUser, TicketGrant, TicketOperations, TokenPair, UpdateCurrentUserInput, User, UserOperations, UserSortDirection, UserSortField } from './browser.js';
|
|
3
|
+
import 'zod';
|
|
4
|
+
import '@h-ai/core';
|
|
5
|
+
import '@h-ai/reach';
|
|
6
|
+
import '@h-ai/reldb';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
|
-
* @h-ai/iam —
|
|
9
|
+
* @h-ai/iam — IAM 服务主入口
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
* @module iam-
|
|
11
|
+
* 管理运行时状态、实现生命周期(init / close)、通过 get 访问器暴露子功能。
|
|
12
|
+
* @module iam-main
|
|
12
13
|
*/
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* 支持的认证方式:
|
|
18
|
-
* - `password` - 用户名/邮箱 + 密码
|
|
19
|
-
* - `otp` - 邮箱/短信 + 验证码
|
|
20
|
-
* - `ldap` - LDAP 目录认证
|
|
21
|
-
*/
|
|
22
|
-
declare const AuthStrategyTypeSchema: z.ZodEnum<{
|
|
23
|
-
password: "password";
|
|
24
|
-
otp: "otp";
|
|
25
|
-
ldap: "ldap";
|
|
26
|
-
apikey: "apikey";
|
|
27
|
-
}>;
|
|
28
|
-
/** 认证策略类型 */
|
|
29
|
-
type AuthStrategyType = z.infer<typeof AuthStrategyTypeSchema>;
|
|
30
|
-
/**
|
|
31
|
-
* 密码配置 Schema
|
|
32
|
-
*/
|
|
33
|
-
declare const PasswordConfigSchema: z.ZodObject<{
|
|
34
|
-
minLength: z.ZodDefault<z.ZodNumber>;
|
|
35
|
-
maxLength: z.ZodDefault<z.ZodNumber>;
|
|
36
|
-
requireUppercase: z.ZodDefault<z.ZodBoolean>;
|
|
37
|
-
requireLowercase: z.ZodDefault<z.ZodBoolean>;
|
|
38
|
-
requireNumber: z.ZodDefault<z.ZodBoolean>;
|
|
39
|
-
requireSpecialChar: z.ZodDefault<z.ZodBoolean>;
|
|
40
|
-
expirationDays: z.ZodDefault<z.ZodNumber>;
|
|
41
|
-
}, z.core.$strip>;
|
|
42
|
-
/** 密码配置类型 */
|
|
43
|
-
type PasswordConfig = z.infer<typeof PasswordConfigSchema>;
|
|
44
|
-
/**
|
|
45
|
-
* OTP 配置 Schema
|
|
46
|
-
*/
|
|
47
|
-
declare const OtpConfigSchema: z.ZodObject<{
|
|
48
|
-
email: z.ZodDefault<z.ZodBoolean>;
|
|
49
|
-
sms: z.ZodDefault<z.ZodBoolean>;
|
|
50
|
-
length: z.ZodDefault<z.ZodNumber>;
|
|
51
|
-
expiresIn: z.ZodDefault<z.ZodNumber>;
|
|
52
|
-
maxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
53
|
-
resendInterval: z.ZodDefault<z.ZodNumber>;
|
|
54
|
-
}, z.core.$strip>;
|
|
55
|
-
/** OTP 配置类型 */
|
|
56
|
-
type OtpConfig = z.infer<typeof OtpConfigSchema>;
|
|
57
|
-
/**
|
|
58
|
-
* 密码重置配置 Schema
|
|
59
|
-
*/
|
|
60
|
-
declare const PasswordResetConfigSchema: z.ZodObject<{
|
|
61
|
-
mode: z.ZodDefault<z.ZodEnum<{
|
|
62
|
-
email: "email";
|
|
63
|
-
phone: "phone";
|
|
64
|
-
}>>;
|
|
65
|
-
resetUrl: z.ZodOptional<z.ZodURL>;
|
|
66
|
-
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
67
|
-
tokenExpiresIn: z.ZodDefault<z.ZodNumber>;
|
|
68
|
-
maxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
69
|
-
}, z.core.$strip>;
|
|
70
|
-
/** 密码重置配置类型 */
|
|
71
|
-
type PasswordResetConfig = z.infer<typeof PasswordResetConfigSchema>;
|
|
72
|
-
/**
|
|
73
|
-
* LDAP 配置 Schema
|
|
74
|
-
*/
|
|
75
|
-
declare const LdapConfigSchema: z.ZodObject<{
|
|
76
|
-
url: z.ZodURL;
|
|
77
|
-
bindDn: z.ZodString;
|
|
78
|
-
bindPassword: z.ZodString;
|
|
79
|
-
searchBase: z.ZodString;
|
|
80
|
-
searchFilter: z.ZodDefault<z.ZodString>;
|
|
81
|
-
usernameAttribute: z.ZodDefault<z.ZodString>;
|
|
82
|
-
emailAttribute: z.ZodDefault<z.ZodString>;
|
|
83
|
-
displayNameAttribute: z.ZodDefault<z.ZodString>;
|
|
84
|
-
useTls: z.ZodDefault<z.ZodBoolean>;
|
|
85
|
-
connectTimeout: z.ZodDefault<z.ZodNumber>;
|
|
86
|
-
}, z.core.$strip>;
|
|
87
|
-
/** LDAP 配置类型 */
|
|
88
|
-
type LdapConfig = z.infer<typeof LdapConfigSchema>;
|
|
89
|
-
/**
|
|
90
|
-
* API Key 配置 Schema
|
|
91
|
-
*/
|
|
92
|
-
declare const ApiKeyConfigSchema: z.ZodObject<{
|
|
93
|
-
maxKeysPerUser: z.ZodDefault<z.ZodNumber>;
|
|
94
|
-
defaultExpirationDays: z.ZodDefault<z.ZodNumber>;
|
|
95
|
-
prefix: z.ZodDefault<z.ZodString>;
|
|
96
|
-
}, z.core.$strip>;
|
|
97
|
-
/** API Key 配置类型 */
|
|
98
|
-
type ApiKeyConfig = z.infer<typeof ApiKeyConfigSchema>;
|
|
99
|
-
/** 登录类型启用配置 */
|
|
100
|
-
declare const LoginConfigSchema: z.ZodObject<{
|
|
101
|
-
password: z.ZodDefault<z.ZodBoolean>;
|
|
102
|
-
otp: z.ZodDefault<z.ZodBoolean>;
|
|
103
|
-
ldap: z.ZodDefault<z.ZodBoolean>;
|
|
104
|
-
apikey: z.ZodDefault<z.ZodBoolean>;
|
|
105
|
-
}, z.core.$strip>;
|
|
106
|
-
type LoginConfig = z.infer<typeof LoginConfigSchema>;
|
|
107
|
-
/** 注册配置 */
|
|
108
|
-
declare const RegisterConfigSchema: z.ZodObject<{
|
|
109
|
-
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
110
|
-
defaultEnabled: z.ZodDefault<z.ZodBoolean>;
|
|
111
|
-
}, z.core.$strip>;
|
|
112
|
-
type RegisterConfig = z.infer<typeof RegisterConfigSchema>;
|
|
113
|
-
/** 安全策略配置 */
|
|
114
|
-
declare const SecurityConfigSchema: z.ZodObject<{
|
|
115
|
-
maxLoginAttempts: z.ZodDefault<z.ZodNumber>;
|
|
116
|
-
lockoutDuration: z.ZodDefault<z.ZodNumber>;
|
|
117
|
-
}, z.core.$strip>;
|
|
118
|
-
type SecurityConfig = z.infer<typeof SecurityConfigSchema>;
|
|
119
|
-
/** 协议展示配置 */
|
|
120
|
-
declare const AgreementConfigSchema: z.ZodObject<{
|
|
121
|
-
userAgreementMarkdown: z.ZodOptional<z.ZodString>;
|
|
122
|
-
privacyPolicyMarkdown: z.ZodOptional<z.ZodString>;
|
|
123
|
-
userAgreementUrl: z.ZodOptional<z.ZodURL>;
|
|
124
|
-
privacyPolicyUrl: z.ZodOptional<z.ZodURL>;
|
|
125
|
-
showOnRegister: z.ZodDefault<z.ZodBoolean>;
|
|
126
|
-
showOnLogin: z.ZodDefault<z.ZodBoolean>;
|
|
127
|
-
}, z.core.$strip>;
|
|
128
|
-
type AgreementConfig = z.infer<typeof AgreementConfigSchema>;
|
|
129
|
-
declare const AuthUiConfigSchema: z.ZodObject<{
|
|
130
|
-
variant: z.ZodDefault<z.ZodEnum<{
|
|
131
|
-
card: "card";
|
|
132
|
-
split: "split";
|
|
133
|
-
}>>;
|
|
134
|
-
title: z.ZodOptional<z.ZodString>;
|
|
135
|
-
subtitle: z.ZodOptional<z.ZodString>;
|
|
136
|
-
brandTitle: z.ZodOptional<z.ZodString>;
|
|
137
|
-
brandText: z.ZodOptional<z.ZodString>;
|
|
138
|
-
logoUrl: z.ZodOptional<z.ZodString>;
|
|
139
|
-
illustrationUrl: z.ZodOptional<z.ZodString>;
|
|
140
|
-
}, z.core.$strip>;
|
|
141
|
-
type AuthUiConfig = z.infer<typeof AuthUiConfigSchema>;
|
|
142
|
-
/**
|
|
143
|
-
* 会话配置 Schema
|
|
144
|
-
*/
|
|
145
|
-
declare const SessionConfigSchema: z.ZodObject<{
|
|
146
|
-
maxAge: z.ZodDefault<z.ZodNumber>;
|
|
147
|
-
sliding: z.ZodDefault<z.ZodBoolean>;
|
|
148
|
-
singleDevice: z.ZodDefault<z.ZodBoolean>;
|
|
149
|
-
refreshTokenMaxAge: z.ZodDefault<z.ZodNumber>;
|
|
150
|
-
}, z.core.$strip>;
|
|
151
|
-
/** 会话配置类型 */
|
|
152
|
-
type SessionConfig = z.infer<typeof SessionConfigSchema>;
|
|
153
|
-
/**
|
|
154
|
-
* RBAC 配置 Schema
|
|
155
|
-
*/
|
|
156
|
-
declare const RbacConfigSchema: z.ZodObject<{
|
|
157
|
-
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
158
|
-
superAdminRole: z.ZodDefault<z.ZodString>;
|
|
159
|
-
defaultRole: z.ZodDefault<z.ZodString>;
|
|
160
|
-
}, z.core.$strip>;
|
|
161
|
-
/** RBAC 配置类型 */
|
|
162
|
-
type RbacConfig = z.infer<typeof RbacConfigSchema>;
|
|
163
|
-
/**
|
|
164
|
-
* IAM 统一配置 Schema
|
|
165
|
-
*
|
|
16
|
+
* IAM 服务单例;应用先初始化共享 RelDB/Cache,再 init → use → close,子功能返回 HaiResult。
|
|
166
17
|
* @example
|
|
167
18
|
* ```ts
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
176
|
-
* rbac: { enabled: true }
|
|
19
|
+
* import { iam } from '@h-ai/iam'
|
|
20
|
+
* // Cache、RelDB、Crypto 已由应用按顺序初始化。
|
|
21
|
+
* const initialized = await iam.init({ seedDefaultData: false })
|
|
22
|
+
* if (initialized.success) {
|
|
23
|
+
* const result = await iam.user.getUser('user-1')
|
|
24
|
+
* if (result.success && result.data)
|
|
25
|
+
* result.data.username
|
|
26
|
+
* await iam.close()
|
|
177
27
|
* }
|
|
178
28
|
* ```
|
|
179
29
|
*/
|
|
180
|
-
declare const IamConfigSchema: z.ZodObject<{
|
|
181
|
-
ui: z.ZodOptional<z.ZodObject<{
|
|
182
|
-
variant: z.ZodDefault<z.ZodEnum<{
|
|
183
|
-
card: "card";
|
|
184
|
-
split: "split";
|
|
185
|
-
}>>;
|
|
186
|
-
title: z.ZodOptional<z.ZodString>;
|
|
187
|
-
subtitle: z.ZodOptional<z.ZodString>;
|
|
188
|
-
brandTitle: z.ZodOptional<z.ZodString>;
|
|
189
|
-
brandText: z.ZodOptional<z.ZodString>;
|
|
190
|
-
logoUrl: z.ZodOptional<z.ZodString>;
|
|
191
|
-
illustrationUrl: z.ZodOptional<z.ZodString>;
|
|
192
|
-
}, z.core.$strip>>;
|
|
193
|
-
password: z.ZodOptional<z.ZodObject<{
|
|
194
|
-
minLength: z.ZodDefault<z.ZodNumber>;
|
|
195
|
-
maxLength: z.ZodDefault<z.ZodNumber>;
|
|
196
|
-
requireUppercase: z.ZodDefault<z.ZodBoolean>;
|
|
197
|
-
requireLowercase: z.ZodDefault<z.ZodBoolean>;
|
|
198
|
-
requireNumber: z.ZodDefault<z.ZodBoolean>;
|
|
199
|
-
requireSpecialChar: z.ZodDefault<z.ZodBoolean>;
|
|
200
|
-
expirationDays: z.ZodDefault<z.ZodNumber>;
|
|
201
|
-
}, z.core.$strip>>;
|
|
202
|
-
otp: z.ZodOptional<z.ZodObject<{
|
|
203
|
-
email: z.ZodDefault<z.ZodBoolean>;
|
|
204
|
-
sms: z.ZodDefault<z.ZodBoolean>;
|
|
205
|
-
length: z.ZodDefault<z.ZodNumber>;
|
|
206
|
-
expiresIn: z.ZodDefault<z.ZodNumber>;
|
|
207
|
-
maxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
208
|
-
resendInterval: z.ZodDefault<z.ZodNumber>;
|
|
209
|
-
}, z.core.$strip>>;
|
|
210
|
-
ldap: z.ZodOptional<z.ZodObject<{
|
|
211
|
-
url: z.ZodURL;
|
|
212
|
-
bindDn: z.ZodString;
|
|
213
|
-
bindPassword: z.ZodString;
|
|
214
|
-
searchBase: z.ZodString;
|
|
215
|
-
searchFilter: z.ZodDefault<z.ZodString>;
|
|
216
|
-
usernameAttribute: z.ZodDefault<z.ZodString>;
|
|
217
|
-
emailAttribute: z.ZodDefault<z.ZodString>;
|
|
218
|
-
displayNameAttribute: z.ZodDefault<z.ZodString>;
|
|
219
|
-
useTls: z.ZodDefault<z.ZodBoolean>;
|
|
220
|
-
connectTimeout: z.ZodDefault<z.ZodNumber>;
|
|
221
|
-
}, z.core.$strip>>;
|
|
222
|
-
apikey: z.ZodOptional<z.ZodObject<{
|
|
223
|
-
maxKeysPerUser: z.ZodDefault<z.ZodNumber>;
|
|
224
|
-
defaultExpirationDays: z.ZodDefault<z.ZodNumber>;
|
|
225
|
-
prefix: z.ZodDefault<z.ZodString>;
|
|
226
|
-
}, z.core.$strip>>;
|
|
227
|
-
passwordReset: z.ZodOptional<z.ZodObject<{
|
|
228
|
-
mode: z.ZodDefault<z.ZodEnum<{
|
|
229
|
-
email: "email";
|
|
230
|
-
phone: "phone";
|
|
231
|
-
}>>;
|
|
232
|
-
resetUrl: z.ZodOptional<z.ZodURL>;
|
|
233
|
-
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
234
|
-
tokenExpiresIn: z.ZodDefault<z.ZodNumber>;
|
|
235
|
-
maxAttempts: z.ZodDefault<z.ZodNumber>;
|
|
236
|
-
}, z.core.$strip>>;
|
|
237
|
-
login: z.ZodDefault<z.ZodObject<{
|
|
238
|
-
password: z.ZodDefault<z.ZodBoolean>;
|
|
239
|
-
otp: z.ZodDefault<z.ZodBoolean>;
|
|
240
|
-
ldap: z.ZodDefault<z.ZodBoolean>;
|
|
241
|
-
apikey: z.ZodDefault<z.ZodBoolean>;
|
|
242
|
-
}, z.core.$strip>>;
|
|
243
|
-
register: z.ZodDefault<z.ZodObject<{
|
|
244
|
-
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
245
|
-
defaultEnabled: z.ZodDefault<z.ZodBoolean>;
|
|
246
|
-
}, z.core.$strip>>;
|
|
247
|
-
agreements: z.ZodDefault<z.ZodObject<{
|
|
248
|
-
userAgreementMarkdown: z.ZodOptional<z.ZodString>;
|
|
249
|
-
privacyPolicyMarkdown: z.ZodOptional<z.ZodString>;
|
|
250
|
-
userAgreementUrl: z.ZodOptional<z.ZodURL>;
|
|
251
|
-
privacyPolicyUrl: z.ZodOptional<z.ZodURL>;
|
|
252
|
-
showOnRegister: z.ZodDefault<z.ZodBoolean>;
|
|
253
|
-
showOnLogin: z.ZodDefault<z.ZodBoolean>;
|
|
254
|
-
}, z.core.$strip>>;
|
|
255
|
-
security: z.ZodDefault<z.ZodObject<{
|
|
256
|
-
maxLoginAttempts: z.ZodDefault<z.ZodNumber>;
|
|
257
|
-
lockoutDuration: z.ZodDefault<z.ZodNumber>;
|
|
258
|
-
}, z.core.$strip>>;
|
|
259
|
-
session: z.ZodOptional<z.ZodObject<{
|
|
260
|
-
maxAge: z.ZodDefault<z.ZodNumber>;
|
|
261
|
-
sliding: z.ZodDefault<z.ZodBoolean>;
|
|
262
|
-
singleDevice: z.ZodDefault<z.ZodBoolean>;
|
|
263
|
-
refreshTokenMaxAge: z.ZodDefault<z.ZodNumber>;
|
|
264
|
-
}, z.core.$strip>>;
|
|
265
|
-
rbac: z.ZodDefault<z.ZodObject<{
|
|
266
|
-
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
267
|
-
superAdminRole: z.ZodDefault<z.ZodString>;
|
|
268
|
-
defaultRole: z.ZodDefault<z.ZodString>;
|
|
269
|
-
}, z.core.$strip>>;
|
|
270
|
-
seedDefaultData: z.ZodDefault<z.ZodBoolean>;
|
|
271
|
-
}, z.core.$strip>;
|
|
272
|
-
/** IAM 配置类型 */
|
|
273
|
-
type IamConfig = z.infer<typeof IamConfigSchema>;
|
|
274
|
-
/**
|
|
275
|
-
* IAM 配置设置输入类型(仅设置字段,不含运行时依赖)
|
|
276
|
-
*
|
|
277
|
-
* 说明:Zod 的 default 会让输入端字段可省略,但输出端字段为必填。
|
|
278
|
-
*/
|
|
279
|
-
type IamConfigSettingsInput = z.input<typeof IamConfigSchema>;
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* @h-ai/iam — API Key 类型定义
|
|
283
|
-
*
|
|
284
|
-
* 包含 API Key 实体、创建选项、查询选项等类型。
|
|
285
|
-
* @module iam-authn-apikey-types
|
|
286
|
-
*/
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* API Key 实体(对外展示)
|
|
290
|
-
*
|
|
291
|
-
* 不含密钥哈希等敏感信息。
|
|
292
|
-
*/
|
|
293
|
-
interface ApiKey {
|
|
294
|
-
/** API Key ID */
|
|
295
|
-
id: string;
|
|
296
|
-
/** 所属用户 ID */
|
|
297
|
-
userId: string;
|
|
298
|
-
/** API Key 名称(用户自定义标识) */
|
|
299
|
-
name: string;
|
|
300
|
-
/** 密钥前缀(用于展示,如 'hai_abc1****') */
|
|
301
|
-
keyPrefix: string;
|
|
302
|
-
/** 是否启用 */
|
|
303
|
-
enabled: boolean;
|
|
304
|
-
/** 过期时间(null 表示永不过期) */
|
|
305
|
-
expiresAt: Date | null;
|
|
306
|
-
/** 创建时间 */
|
|
307
|
-
createdAt: Date;
|
|
308
|
-
/** 最后使用时间 */
|
|
309
|
-
lastUsedAt: Date | null;
|
|
310
|
-
/** 权限代码范围,支持 * / 命名空间 :*;空数组无操作权限,* 不超出主体权限。 */
|
|
311
|
-
scopes: string[];
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* 创建 API Key 的返回结果
|
|
315
|
-
*
|
|
316
|
-
* 仅在创建时返回明文密钥,之后无法再获取。
|
|
317
|
-
*/
|
|
318
|
-
interface CreateApiKeyResult {
|
|
319
|
-
/** API Key 元数据 */
|
|
320
|
-
apiKey: ApiKey;
|
|
321
|
-
/** 明文密钥(仅此一次展示) */
|
|
322
|
-
rawKey: string;
|
|
323
|
-
}
|
|
324
|
-
/**
|
|
325
|
-
* 创建 API Key 选项
|
|
326
|
-
*/
|
|
327
|
-
interface CreateApiKeyOptions {
|
|
328
|
-
/** API Key 名称 */
|
|
329
|
-
name: string;
|
|
330
|
-
/** 有效期天数(0 或不传表示永不过期) */
|
|
331
|
-
expirationDays?: number;
|
|
332
|
-
/** 权限代码范围;默认空数组。受限 key 不保留角色授权入口,使用 permission 守卫。 */
|
|
333
|
-
scopes?: string[];
|
|
334
|
-
}
|
|
335
|
-
/** API Key 列表允许的服务端排序字段。 */
|
|
336
|
-
type ApiKeySortField = 'name' | 'createdAt' | 'lastUsedAt' | 'expiresAt';
|
|
337
|
-
/** API Key 列表排序方向。 */
|
|
338
|
-
type ApiKeySortDirection = 'asc' | 'desc';
|
|
339
|
-
/**
|
|
340
|
-
* API Key 列表查询选项
|
|
341
|
-
*/
|
|
342
|
-
interface ListApiKeysOptions extends PaginationOptionsInput {
|
|
343
|
-
/** 搜索关键字(模糊匹配名称与密钥前缀) */
|
|
344
|
-
search?: string;
|
|
345
|
-
/** 按启用状态过滤,不传则返回全部 */
|
|
346
|
-
enabled?: boolean;
|
|
347
|
-
/** 服务端排序字段;未指定时保持按创建时间倒序的历史行为。 */
|
|
348
|
-
sortBy?: ApiKeySortField;
|
|
349
|
-
/** 服务端排序方向;仅在指定 sortBy 时生效,默认 desc。 */
|
|
350
|
-
sortDirection?: ApiKeySortDirection;
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* API Key 管理操作接口
|
|
354
|
-
*/
|
|
355
|
-
interface ApiKeyOperations {
|
|
356
|
-
/**
|
|
357
|
-
* 创建 API Key
|
|
358
|
-
*
|
|
359
|
-
* @param userId - 用户 ID
|
|
360
|
-
* @param options - 创建选项
|
|
361
|
-
* @returns 成功返回 API Key 元数据和明文密钥
|
|
362
|
-
*/
|
|
363
|
-
createApiKey: (userId: string, options: CreateApiKeyOptions) => Promise<HaiResult<CreateApiKeyResult>>;
|
|
364
|
-
/**
|
|
365
|
-
* 分页列出用户的 API Key
|
|
366
|
-
*
|
|
367
|
-
* @param userId - 用户 ID
|
|
368
|
-
* @param options - 分页、搜索、过滤与排序选项
|
|
369
|
-
* @returns 分页 API Key 列表(不含密钥哈希)
|
|
370
|
-
*/
|
|
371
|
-
listApiKeys: (userId: string, options?: ListApiKeysOptions) => Promise<HaiResult<PaginatedResult<ApiKey>>>;
|
|
372
|
-
/**
|
|
373
|
-
* 获取 API Key 详情
|
|
374
|
-
*
|
|
375
|
-
* @param keyId - API Key ID
|
|
376
|
-
* @returns API Key 详情
|
|
377
|
-
*/
|
|
378
|
-
getApiKey: (keyId: string) => Promise<HaiResult<ApiKey | null>>;
|
|
379
|
-
/**
|
|
380
|
-
* 吊销/删除 API Key
|
|
381
|
-
*
|
|
382
|
-
* @param keyId - API Key ID
|
|
383
|
-
* @returns 操作结果
|
|
384
|
-
*/
|
|
385
|
-
revokeApiKey: (keyId: string) => Promise<HaiResult<void>>;
|
|
386
|
-
/**
|
|
387
|
-
* 验证 API Key 并返回关联用户 ID
|
|
388
|
-
*
|
|
389
|
-
* @param rawKey - 明文 API Key
|
|
390
|
-
* @returns 成功返回 API Key 实体(含用户 ID),失败返回错误码
|
|
391
|
-
*/
|
|
392
|
-
verifyApiKey: (rawKey: string) => Promise<HaiResult<ApiKey>>;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
/**
|
|
396
|
-
* @h-ai/iam — 授权子功能类型定义(RBAC)
|
|
397
|
-
*
|
|
398
|
-
* @module iam-authz-types
|
|
399
|
-
*/
|
|
400
|
-
|
|
401
|
-
/**
|
|
402
|
-
* 权限类型
|
|
403
|
-
*
|
|
404
|
-
* - menu:菜单/导航可见性控制
|
|
405
|
-
* - api:接口级访问控制
|
|
406
|
-
* - button:操作按钮显隐控制
|
|
407
|
-
*/
|
|
408
|
-
type PermissionType = 'menu' | 'api' | 'button';
|
|
409
|
-
/**
|
|
410
|
-
* 权限查询参数
|
|
411
|
-
*
|
|
412
|
-
* 扩展分页参数,支持按类型和关键字筛选。
|
|
413
|
-
*/
|
|
414
|
-
interface PermissionQueryOptions extends PaginationOptionsInput {
|
|
415
|
-
/** 按权限类型筛选 */
|
|
416
|
-
type?: PermissionType;
|
|
417
|
-
/** 按关键字搜索(匹配 code 或 name) */
|
|
418
|
-
search?: string;
|
|
419
|
-
}
|
|
420
|
-
/**
|
|
421
|
-
* 权限
|
|
422
|
-
*/
|
|
423
|
-
interface Permission {
|
|
424
|
-
/** 权限 ID */
|
|
425
|
-
id: string;
|
|
426
|
-
/** 权限代码(如 users:read, posts:write) */
|
|
427
|
-
code: string;
|
|
428
|
-
/** 权限名称 */
|
|
429
|
-
name: string;
|
|
430
|
-
/** 权限描述 */
|
|
431
|
-
description?: string;
|
|
432
|
-
/** 权限类型(menu / api / button) */
|
|
433
|
-
type?: PermissionType;
|
|
434
|
-
/** 资源类型 */
|
|
435
|
-
resource?: string;
|
|
436
|
-
/** 操作类型(create/read/update/delete) */
|
|
437
|
-
action?: string;
|
|
438
|
-
/** 创建时间 */
|
|
439
|
-
createdAt: Date;
|
|
440
|
-
/** 更新时间 */
|
|
441
|
-
updatedAt: Date;
|
|
442
|
-
}
|
|
443
|
-
/**
|
|
444
|
-
* 角色
|
|
445
|
-
*/
|
|
446
|
-
interface Role {
|
|
447
|
-
/** 角色 ID */
|
|
448
|
-
id: string;
|
|
449
|
-
/** 角色代码 */
|
|
450
|
-
code: string;
|
|
451
|
-
/** 角色名称 */
|
|
452
|
-
name: string;
|
|
453
|
-
/** 角色描述 */
|
|
454
|
-
description?: string;
|
|
455
|
-
/** 是否系统角色(不可删除) */
|
|
456
|
-
isSystem?: boolean;
|
|
457
|
-
/** 创建时间 */
|
|
458
|
-
createdAt: Date;
|
|
459
|
-
/** 更新时间 */
|
|
460
|
-
updatedAt: Date;
|
|
461
|
-
}
|
|
462
|
-
/**
|
|
463
|
-
* 授权子功能接口
|
|
464
|
-
*/
|
|
465
|
-
interface AuthzOperations {
|
|
466
|
-
/** 查询当前角色与权限代码,一次读取角色并批量聚合权限,不依赖会话缓存。 */
|
|
467
|
-
getUserAuthorization: (userId: string) => Promise<HaiResult<Pick<Session, 'roles' | 'permissions'>>>;
|
|
468
|
-
/**
|
|
469
|
-
* 检查权限
|
|
470
|
-
*
|
|
471
|
-
* 超级管理员角色自动拥有所有权限。
|
|
472
|
-
* 支持通配符匹配(如 `user:*` 匹配 `user:read`)。
|
|
473
|
-
*
|
|
474
|
-
* **数据来源**:角色列表和权限代码均从数据库实时查询。
|
|
475
|
-
*
|
|
476
|
-
* @param userId - 用户 ID
|
|
477
|
-
* @param permission - 权限代码(如 `user:read`)
|
|
478
|
-
* @returns 成功返回 true/false
|
|
479
|
-
*/
|
|
480
|
-
checkPermission: (userId: string, permission: string) => Promise<HaiResult<boolean>>;
|
|
481
|
-
/**
|
|
482
|
-
* 获取用户权限列表
|
|
483
|
-
*
|
|
484
|
-
* 通过用户角色聚合所有权限(自动去重)。
|
|
485
|
-
*
|
|
486
|
-
* **数据来源**:直接查询数据库,返回最新数据。
|
|
487
|
-
*
|
|
488
|
-
* @param userId - 用户 ID
|
|
489
|
-
* @returns 成功返回去重后的权限列表
|
|
490
|
-
*/
|
|
491
|
-
getUserPermissions: (userId: string) => Promise<HaiResult<Permission[]>>;
|
|
492
|
-
/**
|
|
493
|
-
* 获取用户角色列表
|
|
494
|
-
*
|
|
495
|
-
* **数据来源**:直接查询数据库,返回最新数据。
|
|
496
|
-
*
|
|
497
|
-
* @param userId - 用户 ID
|
|
498
|
-
* @returns 成功返回角色列表
|
|
499
|
-
*/
|
|
500
|
-
getUserRoles: (userId: string) => Promise<HaiResult<Role[]>>;
|
|
501
|
-
/**
|
|
502
|
-
* 分配角色给用户
|
|
503
|
-
*
|
|
504
|
-
* @param userId - 用户 ID
|
|
505
|
-
* @param roleId - 角色 ID
|
|
506
|
-
* @returns 成功返回 ok;角色不存在返回 ROLE_NOT_FOUND
|
|
507
|
-
*/
|
|
508
|
-
assignRole: (userId: string, roleId: string, tx?: DmlWithTxOperations) => Promise<HaiResult<void>>;
|
|
509
|
-
/**
|
|
510
|
-
* 移除用户角色
|
|
511
|
-
*
|
|
512
|
-
* @param userId - 用户 ID
|
|
513
|
-
* @param roleId - 角色 ID
|
|
514
|
-
* @returns 成功返回 ok
|
|
515
|
-
*/
|
|
516
|
-
removeRole: (userId: string, roleId: string, tx?: DmlWithTxOperations) => Promise<HaiResult<void>>;
|
|
517
|
-
/**
|
|
518
|
-
* 同步用户角色(替换为目标角色列表)
|
|
519
|
-
*
|
|
520
|
-
* 自动计算当前角色与目标角色的差集,批量移除多余角色、添加缺失角色,
|
|
521
|
-
* 最终同步一次会话权限。若目标与当前一致则跳过操作。
|
|
522
|
-
*
|
|
523
|
-
* @param userId - 用户 ID
|
|
524
|
-
* @param roleIds - 目标角色 ID 列表
|
|
525
|
-
* @returns 成功返回 ok
|
|
526
|
-
*/
|
|
527
|
-
syncRoles: (userId: string, roleIds: string[], tx?: DmlWithTxOperations) => Promise<HaiResult<void>>;
|
|
528
|
-
/**
|
|
529
|
-
* 创建角色
|
|
530
|
-
*
|
|
531
|
-
* @param role - 角色数据(code、name、description、isSystem)
|
|
532
|
-
* @returns 成功返回创建的角色(含 id 和时间戳)
|
|
533
|
-
*/
|
|
534
|
-
createRole: (role: Omit<Role, 'id' | 'createdAt' | 'updatedAt'> & {
|
|
535
|
-
permissionIds?: string[];
|
|
536
|
-
}, tx?: DmlWithTxOperations) => Promise<HaiResult<Role>>;
|
|
537
|
-
/**
|
|
538
|
-
* 获取角色
|
|
539
|
-
*
|
|
540
|
-
* @param roleId - 角色 ID
|
|
541
|
-
* @returns 成功返回角色或 null(不存在时)
|
|
542
|
-
*/
|
|
543
|
-
getRole: (roleId: string) => Promise<HaiResult<Role | null>>;
|
|
544
|
-
/**
|
|
545
|
-
* 根据角色代码获取角色
|
|
546
|
-
*
|
|
547
|
-
* @param code - 角色代码(如 'admin'、'user')
|
|
548
|
-
* @returns 成功返回角色或 null(不存在时)
|
|
549
|
-
*/
|
|
550
|
-
getRoleByCode: (code: string) => Promise<HaiResult<Role | null>>;
|
|
551
|
-
/**
|
|
552
|
-
* 获取所有角色(分页)
|
|
553
|
-
*
|
|
554
|
-
* @param options - 分页参数,可选
|
|
555
|
-
* @returns 成功返回分页角色列表
|
|
556
|
-
*/
|
|
557
|
-
getAllRoles: (options?: PaginationOptionsInput) => Promise<HaiResult<PaginatedResult<Role>>>;
|
|
558
|
-
/** 批量统计角色成员数;成功时无关联返回 0,查询失败返回错误 */
|
|
559
|
-
getRoleUserCounts: (roleIds: string[]) => Promise<HaiResult<Map<string, number>>>;
|
|
560
|
-
/**
|
|
561
|
-
* 更新角色
|
|
562
|
-
*
|
|
563
|
-
* @param roleId - 角色 ID
|
|
564
|
-
* @param data - 要更新的字段;permissionIds 在同一事务内全量替换,未传则保持权限不变
|
|
565
|
-
* @returns 成功返回更新后的角色;角色不存在返回 ROLE_NOT_FOUND
|
|
566
|
-
*/
|
|
567
|
-
updateRole: (roleId: string, data: Partial<Omit<Role, 'id' | 'createdAt' | 'updatedAt'>> & {
|
|
568
|
-
permissionIds?: string[];
|
|
569
|
-
}, tx?: DmlWithTxOperations) => Promise<HaiResult<Role>>;
|
|
570
|
-
/**
|
|
571
|
-
* 删除角色
|
|
572
|
-
*
|
|
573
|
-
* 级联删除用户-角色、角色-权限关联,并同步受影响用户的会话。
|
|
574
|
-
*
|
|
575
|
-
* @param roleId - 角色 ID
|
|
576
|
-
* @returns 成功返回 ok;角色不存在返回 ROLE_NOT_FOUND
|
|
577
|
-
*/
|
|
578
|
-
deleteRole: (roleId: string, tx?: DmlWithTxOperations) => Promise<HaiResult<void>>;
|
|
579
|
-
/**
|
|
580
|
-
* 创建权限
|
|
581
|
-
*
|
|
582
|
-
* @param permission - 权限数据(code、name、resource、action)
|
|
583
|
-
* @returns 成功返回创建的权限(含 id 和时间戳)
|
|
584
|
-
*/
|
|
585
|
-
createPermission: (permission: Omit<Permission, 'id' | 'createdAt' | 'updatedAt'>, tx?: DmlWithTxOperations) => Promise<HaiResult<Permission>>;
|
|
586
|
-
/**
|
|
587
|
-
* 获取权限
|
|
588
|
-
*
|
|
589
|
-
* @param permissionId - 权限 ID
|
|
590
|
-
* @returns 成功返回权限或 null(不存在时)
|
|
591
|
-
*/
|
|
592
|
-
getPermission: (permissionId: string) => Promise<HaiResult<Permission | null>>;
|
|
593
|
-
/**
|
|
594
|
-
* 根据权限代码获取权限
|
|
595
|
-
*
|
|
596
|
-
* @param code - 权限代码(如 `user:read`)
|
|
597
|
-
* @returns 成功返回权限或 null(不存在时)
|
|
598
|
-
*/
|
|
599
|
-
getPermissionByCode: (code: string) => Promise<HaiResult<Permission | null>>;
|
|
600
|
-
/**
|
|
601
|
-
* 获取所有权限(分页)
|
|
602
|
-
*
|
|
603
|
-
* 支持按权限类型(menu/api/button)和关键字(code/name)筛选。
|
|
604
|
-
*
|
|
605
|
-
* @param options - 分页及筛选参数,可选
|
|
606
|
-
* @returns 成功返回分页权限列表
|
|
607
|
-
*/
|
|
608
|
-
getAllPermissions: (options?: PermissionQueryOptions) => Promise<HaiResult<PaginatedResult<Permission>>>;
|
|
609
|
-
/**
|
|
610
|
-
* 删除权限
|
|
611
|
-
*
|
|
612
|
-
* 级联删除角色-权限关联,并同步受影响用户的会话。
|
|
613
|
-
*
|
|
614
|
-
* @param permissionId - 权限 ID
|
|
615
|
-
* @returns 成功返回 ok;权限不存在返回 PERMISSION_NOT_FOUND
|
|
616
|
-
*/
|
|
617
|
-
deletePermission: (permissionId: string, tx?: DmlWithTxOperations) => Promise<HaiResult<void>>;
|
|
618
|
-
/**
|
|
619
|
-
* 为角色分配权限
|
|
620
|
-
*
|
|
621
|
-
* @param roleId - 角色 ID
|
|
622
|
-
* @param permissionId - 权限 ID
|
|
623
|
-
* @returns 成功返回 ok;角色/权限不存在返回对应错误码
|
|
624
|
-
*/
|
|
625
|
-
assignPermissionToRole: (roleId: string, permissionId: string, tx?: DmlWithTxOperations) => Promise<HaiResult<void>>;
|
|
626
|
-
/**
|
|
627
|
-
* 移除角色权限
|
|
628
|
-
*
|
|
629
|
-
* @param roleId - 角色 ID
|
|
630
|
-
* @param permissionId - 权限 ID
|
|
631
|
-
* @returns 成功返回 ok;权限不存在返回 PERMISSION_NOT_FOUND
|
|
632
|
-
*/
|
|
633
|
-
removePermissionFromRole: (roleId: string, permissionId: string, tx?: DmlWithTxOperations) => Promise<HaiResult<void>>;
|
|
634
|
-
/**
|
|
635
|
-
* 获取角色的权限列表
|
|
636
|
-
*
|
|
637
|
-
* **数据来源**:直接查询数据库,返回最新数据。
|
|
638
|
-
*
|
|
639
|
-
* @param roleId - 角色 ID
|
|
640
|
-
* @returns 成功返回角色关联的权限列表
|
|
641
|
-
*/
|
|
642
|
-
getRolePermissions: (roleId: string) => Promise<HaiResult<Permission[]>>;
|
|
643
|
-
/**
|
|
644
|
-
* 批量获取多个用户的角色列表
|
|
645
|
-
*
|
|
646
|
-
* 单次查询替代 N 次 getUserRoles 调用,避免 N+1 问题。
|
|
647
|
-
* 返回 Map:key 为 userId,value 为该用户的角色列表;无角色的用户返回空数组。
|
|
648
|
-
*
|
|
649
|
-
* **数据来源**:直接查询数据库,返回最新数据。
|
|
650
|
-
*
|
|
651
|
-
* @param userIds - 用户 ID 列表
|
|
652
|
-
* @returns Map<userId, Role[]>
|
|
653
|
-
*/
|
|
654
|
-
getUserRolesForMany: (userIds: string[]) => Promise<HaiResult<Map<string, Role[]>>>;
|
|
655
|
-
/**
|
|
656
|
-
* 批量获取多个角色的权限列表
|
|
657
|
-
*
|
|
658
|
-
* 单次查询替代 N 次 getRolePermissions 调用,避免 N+1 问题。
|
|
659
|
-
* 返回 Map:key 为 roleId,value 为该角色的权限列表;无权限的角色返回空数组。
|
|
660
|
-
*
|
|
661
|
-
* **数据来源**:直接查询数据库,返回最新数据。
|
|
662
|
-
*
|
|
663
|
-
* @param roleIds - 角色 ID 列表
|
|
664
|
-
* @returns Map<roleId, Permission[]>
|
|
665
|
-
*/
|
|
666
|
-
getRolePermissionsForMany: (roleIds: string[]) => Promise<HaiResult<Map<string, Permission[]>>>;
|
|
667
|
-
}
|
|
668
|
-
|
|
669
|
-
/**
|
|
670
|
-
* @h-ai/iam — 用户相关类型定义
|
|
671
|
-
*
|
|
672
|
-
* 包含: - 用户基础类型(User、StoredUser) - 注册选项(RegisterOptions) - 协议展示类型(AgreementDisplay) - 用户操作接口(UserOperations)
|
|
673
|
-
* @module iam-user-types
|
|
674
|
-
*/
|
|
675
|
-
|
|
676
|
-
/** 用户列表允许的服务端排序字段。 */
|
|
677
|
-
type UserSortField = 'username' | 'email' | 'displayName' | 'enabled' | 'createdAt';
|
|
678
|
-
/** 用户列表排序方向。 */
|
|
679
|
-
type UserSortDirection = 'asc' | 'desc';
|
|
680
|
-
/**
|
|
681
|
-
* 用户列表查询选项
|
|
682
|
-
*/
|
|
683
|
-
interface ListUsersOptions extends PaginationOptionsInput {
|
|
684
|
-
/** 角色 code 精确筛选,在数据库分页前执行。 */
|
|
685
|
-
roleCode?: string;
|
|
686
|
-
/** 搜索关键字(模糊匹配用户名、邮箱、手机号、显示名称) */
|
|
687
|
-
search?: string;
|
|
688
|
-
/** 按启用状态过滤,不传则返回全部 */
|
|
689
|
-
enabled?: boolean;
|
|
690
|
-
/** 服务端排序字段;未指定时保持按创建时间倒序的历史行为。 */
|
|
691
|
-
sortBy?: UserSortField;
|
|
692
|
-
/** 服务端排序方向;仅在指定 sortBy 时生效,默认 desc。 */
|
|
693
|
-
sortDirection?: UserSortDirection;
|
|
694
|
-
/** 包含关联数据(如 'roles' 表示同时返回用户角色列表) */
|
|
695
|
-
include?: ('roles')[];
|
|
696
|
-
}
|
|
697
|
-
/**
|
|
698
|
-
* 用户基础信息
|
|
699
|
-
*/
|
|
700
|
-
interface User {
|
|
701
|
-
/** 用户 ID */
|
|
702
|
-
id: string;
|
|
703
|
-
/** 用户名 */
|
|
704
|
-
username: string;
|
|
705
|
-
/** 邮箱 */
|
|
706
|
-
email?: string;
|
|
707
|
-
/** 手机号 */
|
|
708
|
-
phone?: string;
|
|
709
|
-
/** 显示名称 */
|
|
710
|
-
displayName?: string;
|
|
711
|
-
/** 头像 URL */
|
|
712
|
-
avatarUrl?: string;
|
|
713
|
-
/** 是否启用 */
|
|
714
|
-
enabled: boolean;
|
|
715
|
-
/** 是否邮箱验证 */
|
|
716
|
-
emailVerified?: boolean;
|
|
717
|
-
/** 是否手机验证 */
|
|
718
|
-
phoneVerified?: boolean;
|
|
719
|
-
/** 创建时间 */
|
|
720
|
-
createdAt: Date;
|
|
721
|
-
/** 更新时间 */
|
|
722
|
-
updatedAt: Date;
|
|
723
|
-
/** 扩展属性 */
|
|
724
|
-
metadata?: Record<string, unknown>;
|
|
725
|
-
/** 用户角色列表(仅在 include: ['roles'] 时返回) */
|
|
726
|
-
roles?: Role[];
|
|
727
|
-
}
|
|
728
|
-
/**
|
|
729
|
-
* 用户协议/隐私协议展示配置
|
|
730
|
-
*/
|
|
731
|
-
interface AgreementDisplay {
|
|
732
|
-
/** 用户协议 Markdown 正文,显示优先于 URL。 */
|
|
733
|
-
userAgreementMarkdown?: string;
|
|
734
|
-
/** 隐私协议 Markdown 正文,显示优先于 URL。 */
|
|
735
|
-
privacyPolicyMarkdown?: string;
|
|
736
|
-
/** 用户协议 URL */
|
|
737
|
-
userAgreementUrl?: string;
|
|
738
|
-
/** 隐私协议 URL */
|
|
739
|
-
privacyPolicyUrl?: string;
|
|
740
|
-
/** 注册时展示协议 */
|
|
741
|
-
showOnRegister: boolean;
|
|
742
|
-
/** 登录时展示协议 */
|
|
743
|
-
showOnLogin: boolean;
|
|
744
|
-
}
|
|
745
|
-
/**
|
|
746
|
-
* 内部存储用户(包含密码哈希等敏感信息)
|
|
747
|
-
*/
|
|
748
|
-
interface StoredUser extends User {
|
|
749
|
-
/** 密码哈希 */
|
|
750
|
-
passwordHash?: string;
|
|
751
|
-
/** 密码更新时间 */
|
|
752
|
-
passwordUpdatedAt?: Date;
|
|
753
|
-
/** 登录失败次数 */
|
|
754
|
-
loginFailedCount?: number;
|
|
755
|
-
/** 最后登录失败时间 */
|
|
756
|
-
lastLoginFailedAt?: Date;
|
|
757
|
-
/** 锁定截止时间 */
|
|
758
|
-
lockedUntil?: Date;
|
|
759
|
-
}
|
|
760
|
-
/**
|
|
761
|
-
* 用户注册选项
|
|
762
|
-
*/
|
|
763
|
-
interface RegisterOptions {
|
|
764
|
-
/** 用户名 */
|
|
765
|
-
username: string;
|
|
766
|
-
/** 邮箱 */
|
|
767
|
-
email?: string;
|
|
768
|
-
/** 手机号 */
|
|
769
|
-
phone?: string;
|
|
770
|
-
/** 密码 */
|
|
771
|
-
password: string;
|
|
772
|
-
/** 显示名称 */
|
|
773
|
-
displayName?: string;
|
|
774
|
-
/** 扩展属性 */
|
|
775
|
-
metadata?: Record<string, unknown>;
|
|
776
|
-
}
|
|
777
|
-
/**
|
|
778
|
-
* 注册结果
|
|
779
|
-
*/
|
|
780
|
-
interface RegisterResult {
|
|
781
|
-
/** 用户信息 */
|
|
782
|
-
user: User;
|
|
783
|
-
/** 协议展示信息(可选) */
|
|
784
|
-
agreements?: AgreementDisplay;
|
|
785
|
-
}
|
|
786
|
-
/**
|
|
787
|
-
* 当前登录用户可自行修改的字段白名单
|
|
788
|
-
*
|
|
789
|
-
* 仅允许修改个人资料相关字段,禁止修改安全字段(enabled、emailVerified、roles 等)。
|
|
790
|
-
*/
|
|
791
|
-
interface UpdateCurrentUserInput {
|
|
792
|
-
/** 用户名 */
|
|
793
|
-
username?: string;
|
|
794
|
-
/** 邮箱 */
|
|
795
|
-
email?: string;
|
|
796
|
-
/** 显示名称 */
|
|
797
|
-
displayName?: string;
|
|
798
|
-
/** 头像 URL */
|
|
799
|
-
avatarUrl?: string;
|
|
800
|
-
/** 手机号 */
|
|
801
|
-
phone?: string;
|
|
802
|
-
/** 扩展属性 */
|
|
803
|
-
metadata?: Record<string, unknown>;
|
|
804
|
-
}
|
|
805
|
-
/**
|
|
806
|
-
* 用户子功能接口
|
|
807
|
-
*/
|
|
808
|
-
interface UserOperations {
|
|
809
|
-
/** 批量查询最多 1000 个用户 ID,去重并保持输入顺序,忽略不存在的 ID;可批量包含角色。 */
|
|
810
|
-
getUsers: (userIds: readonly string[], options?: {
|
|
811
|
-
include?: ('roles')[];
|
|
812
|
-
}) => Promise<HaiResult<User[]>>;
|
|
813
|
-
/** 管理端创建账户,不受自助注册开关限制;调用端必须执行管理员授权。 */
|
|
814
|
-
createUser: (options: RegisterOptions) => Promise<HaiResult<RegisterResult>>;
|
|
815
|
-
/**
|
|
816
|
-
* 注册用户
|
|
817
|
-
*
|
|
818
|
-
* 校验注册开关、密码强度、用户名/邮箱唯一性后,
|
|
819
|
-
* 在事务中创建用户并分配默认角色。
|
|
820
|
-
*
|
|
821
|
-
* @param options - 注册选项(用户名、密码、邮箱等)
|
|
822
|
-
* @returns 成功返回用户信息及可选的协议展示;失败返回对应错误码
|
|
823
|
-
*/
|
|
824
|
-
register: (options: RegisterOptions) => Promise<HaiResult<RegisterResult>>;
|
|
825
|
-
/**
|
|
826
|
-
* 获取当前用户
|
|
827
|
-
*
|
|
828
|
-
* 通过访问令牌验证会话后查询用户信息。
|
|
829
|
-
*
|
|
830
|
-
* @param accessToken - 访问令牌
|
|
831
|
-
* @returns 成功返回用户信息;令牌无效/过期返回错误
|
|
832
|
-
*/
|
|
833
|
-
getCurrentUser: (accessToken: string) => Promise<HaiResult<User>>;
|
|
834
|
-
/**
|
|
835
|
-
* 更新当前登录用户信息(通过 accessToken 识别用户)
|
|
836
|
-
*
|
|
837
|
-
* 仅允许修改白名单字段(username、email、displayName、avatarUrl、phone、metadata),
|
|
838
|
-
* 禁止修改安全字段(enabled、emailVerified 等)。修改 username/email 时自动校验唯一性。
|
|
839
|
-
*
|
|
840
|
-
* @param accessToken - 访问令牌
|
|
841
|
-
* @param data - 要更新的字段(仅白名单字段)
|
|
842
|
-
* @returns 成功返回更新后的用户信息
|
|
843
|
-
*/
|
|
844
|
-
updateCurrentUser: (accessToken: string, data: UpdateCurrentUserInput) => Promise<HaiResult<User>>;
|
|
845
|
-
/**
|
|
846
|
-
* 获取用户信息
|
|
847
|
-
*
|
|
848
|
-
* @param userId - 用户 ID
|
|
849
|
-
* @param options - 查询选项(可选 include: ['roles'] 同时返回角色列表)
|
|
850
|
-
* @param options.include - 指定需要额外展开的关联字段;传入 ['roles'] 时同时返回角色列表
|
|
851
|
-
* @returns 成功返回用户信息或 null(用户不存在时)
|
|
852
|
-
*/
|
|
853
|
-
getUser: (userId: string, options?: {
|
|
854
|
-
include?: ('roles')[];
|
|
855
|
-
}) => Promise<HaiResult<User | null>>;
|
|
856
|
-
/**
|
|
857
|
-
* 获取用户列表(分页 + 搜索 + 过滤)
|
|
858
|
-
*
|
|
859
|
-
* @param options - 查询选项(页码、每页数量、搜索关键字、启用状态过滤)
|
|
860
|
-
* @returns 成功返回分页用户列表
|
|
861
|
-
*/
|
|
862
|
-
listUsers: (options?: ListUsersOptions) => Promise<HaiResult<PaginatedResult<User>>>;
|
|
863
|
-
/**
|
|
864
|
-
* 更新用户信息
|
|
865
|
-
*
|
|
866
|
-
* 空更新(无有效字段)时直接返回当前用户信息。
|
|
867
|
-
*
|
|
868
|
-
* @param userId - 用户 ID
|
|
869
|
-
* @param data - 要更新的字段(displayName、email 等)
|
|
870
|
-
* @returns 成功返回更新后的用户信息;用户不存在返回 USER_NOT_FOUND
|
|
871
|
-
*/
|
|
872
|
-
updateUser: (userId: string, data: Partial<User>) => Promise<HaiResult<User>>;
|
|
873
|
-
/**
|
|
874
|
-
* 删除用户
|
|
875
|
-
*
|
|
876
|
-
* 同时清理用户的角色关联数据。
|
|
877
|
-
*
|
|
878
|
-
* @param userId - 用户 ID
|
|
879
|
-
* @returns 成功返回 ok;用户不存在返回 USER_NOT_FOUND
|
|
880
|
-
*/
|
|
881
|
-
deleteUser: (userId: string) => Promise<HaiResult<void>>;
|
|
882
|
-
/**
|
|
883
|
-
* 管理员重置用户密码
|
|
884
|
-
*
|
|
885
|
-
* 无需旧密码,直接设置新密码(仅限管理员操作)。
|
|
886
|
-
*
|
|
887
|
-
* @param userId - 用户 ID
|
|
888
|
-
* @param newPassword - 新密码
|
|
889
|
-
* @returns 成功返回 ok;用户不存在返回 USER_NOT_FOUND,密码不合规返回 PASSWORD_POLICY_VIOLATION
|
|
890
|
-
*/
|
|
891
|
-
adminResetPassword: (userId: string, newPassword: string) => Promise<HaiResult<void>>;
|
|
892
|
-
/**
|
|
893
|
-
* 修改密码
|
|
894
|
-
*
|
|
895
|
-
* 验证旧密码 → 校验新密码强度 → 哈希并更新。
|
|
896
|
-
*
|
|
897
|
-
* @param userId - 用户 ID
|
|
898
|
-
* @param oldPassword - 旧密码
|
|
899
|
-
* @param newPassword - 新密码
|
|
900
|
-
* @returns 成功返回 ok;旧密码错误返回 INVALID_CREDENTIALS,新密码不合规返回 PASSWORD_POLICY_VIOLATION
|
|
901
|
-
*/
|
|
902
|
-
changePassword: (userId: string, oldPassword: string, newPassword: string) => Promise<HaiResult<void>>;
|
|
903
|
-
/**
|
|
904
|
-
* 当前登录用户修改密码
|
|
905
|
-
*
|
|
906
|
-
* 通过访问令牌识别用户 → 验证旧密码 → 校验新密码强度 → 哈希并更新 → 清除该用户所有会话。
|
|
907
|
-
*
|
|
908
|
-
* @param accessToken - 当前用户的访问令牌
|
|
909
|
-
* @param oldPassword - 旧密码
|
|
910
|
-
* @param newPassword - 新密码
|
|
911
|
-
* @returns 成功返回 ok;旧密码错误返回 INVALID_CREDENTIALS,新密码不合规返回 PASSWORD_POLICY_VIOLATION
|
|
912
|
-
*/
|
|
913
|
-
changeCurrentUserPassword: (accessToken: string, oldPassword: string, newPassword: string) => Promise<HaiResult<void>>;
|
|
914
|
-
/**
|
|
915
|
-
* 请求密码重置
|
|
916
|
-
*
|
|
917
|
-
* 查找用户 → 生成重置令牌(缓存存储、SHA-256 哈希)→ 调用 onPasswordResetRequest 回调通知业务层。
|
|
918
|
-
* 即使用户不存在也返回 ok(防止用户枚举攻击)。
|
|
919
|
-
*
|
|
920
|
-
* @param identifier - 用户标识(邮箱)
|
|
921
|
-
* @returns 始终返回 ok(防枚举);内部异常返回 INTERNAL_ERROR
|
|
922
|
-
*/
|
|
923
|
-
requestPasswordReset: (identifier: string) => Promise<HaiResult<void>>;
|
|
924
|
-
/**
|
|
925
|
-
* 确认密码重置
|
|
926
|
-
*
|
|
927
|
-
* 验证新密码强度 → 验证令牌有效性与尝试次数 → 哈希并更新密码 → 删除令牌 → 清除该用户所有会话。
|
|
928
|
-
*
|
|
929
|
-
* @param token - 重置令牌(明文,由 requestPasswordReset 生成并由业务层发送给用户)
|
|
930
|
-
* @param newPassword - 新密码
|
|
931
|
-
* @returns 成功返回 ok;令牌无效/过期返回 RESET_TOKEN_INVALID,尝试超限返回 RESET_TOKEN_MAX_ATTEMPTS
|
|
932
|
-
*/
|
|
933
|
-
confirmPasswordReset: (token: string, newPassword: string) => Promise<HaiResult<void>>;
|
|
934
|
-
/**
|
|
935
|
-
* 验证密码强度(同步方法)
|
|
936
|
-
*
|
|
937
|
-
* 根据密码策略校验长度、大小写、数字、特殊字符等要求。
|
|
938
|
-
*
|
|
939
|
-
* @param password - 待校验的密码
|
|
940
|
-
* @returns 通过返回 ok;不合规返回 PASSWORD_POLICY_VIOLATION
|
|
941
|
-
*/
|
|
942
|
-
validatePassword: (password: string) => HaiResult<void>;
|
|
943
|
-
}
|
|
944
|
-
|
|
945
|
-
/**
|
|
946
|
-
* @h-ai/iam — 会话相关类型定义
|
|
947
|
-
*
|
|
948
|
-
* 包含: - 认证结果(AuthResult) - 会话类型(Session) - 会话子功能接口(SessionOperations)
|
|
949
|
-
* @module iam-session-types
|
|
950
|
-
*/
|
|
951
|
-
|
|
952
|
-
/**
|
|
953
|
-
* 认证令牌对(登录成功返回)
|
|
954
|
-
*
|
|
955
|
-
* 所有端(Web SSR / H5 SPA / Capacitor App / 未来小程序)
|
|
956
|
-
* 使用完全相同的 Bearer Token 认证流程。
|
|
957
|
-
*/
|
|
958
|
-
interface TokenPair {
|
|
959
|
-
/** 访问令牌(短期,用于 API 认证) */
|
|
960
|
-
accessToken: string;
|
|
961
|
-
/** 刷新令牌(长期,用于换取新 accessToken) */
|
|
962
|
-
refreshToken: string;
|
|
963
|
-
/** accessToken 过期时间(秒) */
|
|
964
|
-
expiresIn: number;
|
|
965
|
-
/** 令牌类型,固定为 'Bearer' */
|
|
966
|
-
tokenType: 'Bearer';
|
|
967
|
-
}
|
|
968
|
-
/**
|
|
969
|
-
* 认证结果
|
|
970
|
-
*
|
|
971
|
-
* 登录/注册成功后返回,包含用户信息、令牌、角色权限等。
|
|
972
|
-
* `roles` / `permissions` 来源于会话创建时写入的 RBAC 数据,
|
|
973
|
-
* 调用方无需再通过 `verifyToken` 获取。
|
|
974
|
-
*/
|
|
975
|
-
interface AuthResult {
|
|
976
|
-
/** 用户信息 */
|
|
977
|
-
user: User;
|
|
978
|
-
/** 令牌对(替代原来的单个 accessToken) */
|
|
979
|
-
tokens: TokenPair;
|
|
980
|
-
/** 角色 code 列表(登录时从 RBAC 写入) */
|
|
981
|
-
roles: string[];
|
|
982
|
-
/** 权限 code 列表(登录时从 RBAC 写入) */
|
|
983
|
-
permissions: string[];
|
|
984
|
-
/** 协议展示信息(可选) */
|
|
985
|
-
agreements?: AgreementDisplay;
|
|
986
|
-
}
|
|
987
|
-
/**
|
|
988
|
-
* 会话数据
|
|
989
|
-
*/
|
|
990
|
-
interface Session {
|
|
991
|
-
/** API Key 派生会话绑定的 key ID;普通用户登录时省略。 */
|
|
992
|
-
apiKeyId?: string;
|
|
993
|
-
/** 当前 key scopes;get/verify/refresh 每次重新验证持久化 key 并收敛权限。 */
|
|
994
|
-
apiKeyScopes?: string[];
|
|
995
|
-
/** 用户 ID */
|
|
996
|
-
userId: string;
|
|
997
|
-
/** 用户名 */
|
|
998
|
-
username?: string;
|
|
999
|
-
/** 显示名称 */
|
|
1000
|
-
displayName?: string;
|
|
1001
|
-
/** 头像 URL */
|
|
1002
|
-
avatarUrl?: string;
|
|
1003
|
-
/** 角色 code 列表(登录时写入,用于会话解析) */
|
|
1004
|
-
roles: string[];
|
|
1005
|
-
/** 权限 code 列表(登录时写入,用于会话解析) */
|
|
1006
|
-
permissions: string[];
|
|
1007
|
-
/** 来源(如 pc/android/ios) */
|
|
1008
|
-
source?: string;
|
|
1009
|
-
/** 访问令牌 */
|
|
1010
|
-
accessToken: string;
|
|
1011
|
-
/** 创建时间 */
|
|
1012
|
-
createdAt: Date;
|
|
1013
|
-
/** 最后活动时间 */
|
|
1014
|
-
lastActiveAt: Date;
|
|
1015
|
-
/** 过期时间 */
|
|
1016
|
-
expiresAt: Date;
|
|
1017
|
-
/** 扩展数据(内部保留 _tokenPair 供 logout 时吊销 refreshToken) */
|
|
1018
|
-
data?: SessionData;
|
|
1019
|
-
}
|
|
1020
|
-
/**
|
|
1021
|
-
* 会话扩展数据
|
|
1022
|
-
*
|
|
1023
|
-
* 支持开放的 Record 扩展,同时约束内部保留字段 _tokenPair。
|
|
1024
|
-
*/
|
|
1025
|
-
type SessionData = Record<string, unknown> & {
|
|
1026
|
-
/** 令牌对(内部保留字段,由 session.create 写入,logout 时读取) */
|
|
1027
|
-
_tokenPair?: TokenPair;
|
|
1028
|
-
};
|
|
1029
|
-
/**
|
|
1030
|
-
* 创建会话选项
|
|
1031
|
-
*/
|
|
1032
|
-
interface CreateSessionOptions {
|
|
1033
|
-
/** 服务端已验证的 API Key 绑定;不得来自未验证客户端输入。 */
|
|
1034
|
-
apiKeyId?: string;
|
|
1035
|
-
apiKeyScopes?: string[];
|
|
1036
|
-
/** 用户 ID */
|
|
1037
|
-
userId: string;
|
|
1038
|
-
/** 用户名 */
|
|
1039
|
-
username?: string;
|
|
1040
|
-
/** 显示名称 */
|
|
1041
|
-
displayName?: string;
|
|
1042
|
-
/** 头像 URL */
|
|
1043
|
-
avatarUrl?: string;
|
|
1044
|
-
/** 角色 code 列表 */
|
|
1045
|
-
roles?: string[];
|
|
1046
|
-
/** 权限 code 列表 */
|
|
1047
|
-
permissions?: string[];
|
|
1048
|
-
/** 来源(如 pc/android/ios) */
|
|
1049
|
-
source?: string;
|
|
1050
|
-
/** 过期时间(秒) */
|
|
1051
|
-
maxAge?: number;
|
|
1052
|
-
/** 扩展数据 */
|
|
1053
|
-
data?: SessionData;
|
|
1054
|
-
}
|
|
1055
|
-
/**
|
|
1056
|
-
* 会话子功能接口
|
|
1057
|
-
*/
|
|
1058
|
-
interface SessionOperations {
|
|
1059
|
-
/**
|
|
1060
|
-
* 创建会话
|
|
1061
|
-
*
|
|
1062
|
-
* 单设备模式下会先清除用户已有的所有会话。
|
|
1063
|
-
*
|
|
1064
|
-
* @param options - 会话创建选项(用户 ID、角色、来源等)
|
|
1065
|
-
* @returns 成功返回完整的 Session 对象(含生成的访问令牌和过期时间)
|
|
1066
|
-
*/
|
|
1067
|
-
create: (options: CreateSessionOptions) => Promise<HaiResult<Session>>;
|
|
1068
|
-
/**
|
|
1069
|
-
* 获取会话
|
|
1070
|
-
*
|
|
1071
|
-
* 查询缓存中的会话数据。API Key 会话先重新校验持久化 key 与 scopes;滑动窗口模式下自动续期。
|
|
1072
|
-
* 已过期的会话会自动删除并返回 null。
|
|
1073
|
-
*
|
|
1074
|
-
* @param accessToken - 访问令牌
|
|
1075
|
-
* @returns 成功返回会话对象或 null(会话不存在/已过期)
|
|
1076
|
-
*/
|
|
1077
|
-
get: (accessToken: string) => Promise<HaiResult<Session | null>>;
|
|
1078
|
-
/**
|
|
1079
|
-
* 验证访问令牌
|
|
1080
|
-
*
|
|
1081
|
-
* 等同于 get 但在会话不存在时返回错误而非 null;API Key 撤销/禁用/过期立即拒绝。
|
|
1082
|
-
*
|
|
1083
|
-
* @param accessToken - 访问令牌
|
|
1084
|
-
* @returns 成功返回会话;会话无效返回 SESSION_INVALID
|
|
1085
|
-
*/
|
|
1086
|
-
verifyToken: (accessToken: string) => Promise<HaiResult<Session>>;
|
|
1087
|
-
/**
|
|
1088
|
-
* 更新会话
|
|
1089
|
-
*
|
|
1090
|
-
* 合并 patch 到现有会话(data 字段浅合并)并更新 lastActiveAt。
|
|
1091
|
-
*
|
|
1092
|
-
* @param accessToken - 访问令牌
|
|
1093
|
-
* @param data - 要更新的字段(roles、username、source、data 等)
|
|
1094
|
-
* @returns 成功返回 ok;会话不存在返回 SESSION_NOT_FOUND
|
|
1095
|
-
*/
|
|
1096
|
-
update: (accessToken: string, data: Partial<Session>) => Promise<HaiResult<void>>;
|
|
1097
|
-
/**
|
|
1098
|
-
* 删除会话
|
|
1099
|
-
*
|
|
1100
|
-
* 同时清除用户令牌映射关系。
|
|
1101
|
-
*
|
|
1102
|
-
* @param accessToken - 访问令牌
|
|
1103
|
-
* @returns 始终返回 ok(令牌不存在时静默成功)
|
|
1104
|
-
*/
|
|
1105
|
-
delete: (accessToken: string) => Promise<HaiResult<void>>;
|
|
1106
|
-
/**
|
|
1107
|
-
* 删除用户所有会话
|
|
1108
|
-
*
|
|
1109
|
-
* 遍历用户的所有令牌并逐一删除。
|
|
1110
|
-
*
|
|
1111
|
-
* @param userId - 用户 ID
|
|
1112
|
-
* @returns 成功返回实际删除的会话数量
|
|
1113
|
-
*/
|
|
1114
|
-
deleteByUserId: (userId: string) => Promise<HaiResult<number>>;
|
|
1115
|
-
/**
|
|
1116
|
-
* 通过 refreshToken 换取新的 TokenPair
|
|
1117
|
-
*
|
|
1118
|
-
* 验证 refreshToken 有效性,签发新的 accessToken + refreshToken,
|
|
1119
|
-
* 旧 refreshToken 自动失效(Rotation 策略)。
|
|
1120
|
-
*
|
|
1121
|
-
* @param refreshToken - 刷新令牌
|
|
1122
|
-
* @returns 成功返回新的 TokenPair;失败返回 TOKEN_REFRESH_FAILED / TOKEN_EXPIRED
|
|
1123
|
-
*/
|
|
1124
|
-
refresh: (refreshToken: string) => Promise<HaiResult<TokenPair>>;
|
|
1125
|
-
/**
|
|
1126
|
-
* 吊销 refreshToken(登出时调用)
|
|
1127
|
-
*
|
|
1128
|
-
* @param refreshToken - 刷新令牌
|
|
1129
|
-
* @returns 成功返回 ok;令牌不存在时静默成功
|
|
1130
|
-
*/
|
|
1131
|
-
revokeRefresh: (refreshToken: string) => Promise<HaiResult<void>>;
|
|
1132
|
-
/**
|
|
1133
|
-
* 批量更新用户所有活跃会话的 roles / permissions 字段
|
|
1134
|
-
*
|
|
1135
|
-
* 遍历用户缓存中的所有 session token,合并更新指定字段,
|
|
1136
|
-
* 同时清理已失效的会话令牌。用于角色/权限变更后的会话同步。
|
|
1137
|
-
*
|
|
1138
|
-
* @param userId - 用户 ID
|
|
1139
|
-
* @param updates - 要更新的字段(roles / permissions)
|
|
1140
|
-
* @returns 成功返回 ok
|
|
1141
|
-
*/
|
|
1142
|
-
patchUserSessions: (userId: string, updates: SessionFieldUpdates) => Promise<HaiResult<void>>;
|
|
1143
|
-
}
|
|
1144
|
-
/**
|
|
1145
|
-
* 会话字段更新(仅限 roles / permissions)
|
|
1146
|
-
*
|
|
1147
|
-
* 用于角色/权限变更后的会话同步。
|
|
1148
|
-
*/
|
|
1149
|
-
interface SessionFieldUpdates {
|
|
1150
|
-
/** 角色 code 列表 */
|
|
1151
|
-
roles?: string[];
|
|
1152
|
-
/** 权限 code 列表 */
|
|
1153
|
-
permissions?: string[];
|
|
1154
|
-
}
|
|
1155
|
-
|
|
1156
|
-
/**
|
|
1157
|
-
* @h-ai/iam — 认证类型定义
|
|
1158
|
-
*
|
|
1159
|
-
* 包含: - 凭证类型(Credentials) - 认证策略接口(AuthStrategy) - 认证操作接口(AuthnOperations)
|
|
1160
|
-
* @module iam-authn-types
|
|
1161
|
-
*/
|
|
1162
|
-
|
|
1163
|
-
/**
|
|
1164
|
-
* 用户凭证(用于密码登录)
|
|
1165
|
-
*/
|
|
1166
|
-
interface PasswordCredentials {
|
|
1167
|
-
/** 用户名/邮箱/手机号 */
|
|
1168
|
-
identifier: string;
|
|
1169
|
-
/** 密码 */
|
|
1170
|
-
password: string;
|
|
1171
|
-
/** 记住我 */
|
|
1172
|
-
rememberMe?: boolean;
|
|
1173
|
-
}
|
|
1174
|
-
/**
|
|
1175
|
-
* OTP 凭证(用于验证码登录)
|
|
1176
|
-
*/
|
|
1177
|
-
interface OtpCredentials {
|
|
1178
|
-
/** 邮箱/手机号 */
|
|
1179
|
-
identifier: string;
|
|
1180
|
-
/** 验证码 */
|
|
1181
|
-
code: string;
|
|
1182
|
-
}
|
|
1183
|
-
/**
|
|
1184
|
-
* LDAP 凭证
|
|
1185
|
-
*/
|
|
1186
|
-
interface LdapCredentials {
|
|
1187
|
-
/** 用户名 */
|
|
1188
|
-
username: string;
|
|
1189
|
-
/** 密码 */
|
|
1190
|
-
password: string;
|
|
1191
|
-
}
|
|
1192
|
-
/**
|
|
1193
|
-
* API Key 凭证(用于 API Key 认证)
|
|
1194
|
-
*/
|
|
1195
|
-
interface ApiKeyCredentials {
|
|
1196
|
-
/** 明文 API Key */
|
|
1197
|
-
key: string;
|
|
1198
|
-
}
|
|
1199
|
-
/**
|
|
1200
|
-
* 统一凭证类型
|
|
1201
|
-
*/
|
|
1202
|
-
type Credentials = {
|
|
1203
|
-
type: 'password';
|
|
1204
|
-
} & PasswordCredentials | {
|
|
1205
|
-
type: 'otp';
|
|
1206
|
-
} & OtpCredentials | {
|
|
1207
|
-
type: 'ldap';
|
|
1208
|
-
} & LdapCredentials | {
|
|
1209
|
-
type: 'apikey';
|
|
1210
|
-
} & ApiKeyCredentials;
|
|
1211
|
-
/**
|
|
1212
|
-
* 认证策略接口
|
|
1213
|
-
*
|
|
1214
|
-
* 所有认证方式(密码/OTP/LDAP)都实现此接口
|
|
1215
|
-
*/
|
|
1216
|
-
interface AuthStrategy {
|
|
1217
|
-
/** 策略类型 */
|
|
1218
|
-
readonly type: AuthStrategyType;
|
|
1219
|
-
/** 策略名称 */
|
|
1220
|
-
readonly name: string;
|
|
1221
|
-
/**
|
|
1222
|
-
* 执行认证
|
|
1223
|
-
*
|
|
1224
|
-
* @param credentials - 统一凭证(包含 type 字段标识认证方式)
|
|
1225
|
-
* @returns 认证成功返回用户信息;失败返回对应错误码(INVALID_CREDENTIALS / USER_LOCKED 等)
|
|
1226
|
-
*/
|
|
1227
|
-
authenticate: (credentials: Credentials) => Promise<HaiResult<User>>;
|
|
1228
|
-
}
|
|
1229
|
-
/**
|
|
1230
|
-
* 认证子功能接口
|
|
1231
|
-
*/
|
|
1232
|
-
interface AuthnOperations {
|
|
1233
|
-
/**
|
|
1234
|
-
* 登录(使用密码)
|
|
1235
|
-
*
|
|
1236
|
-
* 检查登录方式启用 → 密码策略认证 → 创建会话 → 返回令牌。
|
|
1237
|
-
*
|
|
1238
|
-
* @param credentials - 密码凭证(identifier + password)
|
|
1239
|
-
* @returns 成功返回 AuthResult(用户信息、令牌、协议展示);失败返回错误
|
|
1240
|
-
*/
|
|
1241
|
-
login: (credentials: PasswordCredentials) => Promise<HaiResult<AuthResult>>;
|
|
1242
|
-
/**
|
|
1243
|
-
* 使用验证码登录
|
|
1244
|
-
*
|
|
1245
|
-
* @param credentials - OTP 凭证(identifier + code)
|
|
1246
|
-
* @returns 成功返回 AuthResult;验证码无效/过期返回 OTP_INVALID
|
|
1247
|
-
*/
|
|
1248
|
-
loginWithOtp: (credentials: OtpCredentials) => Promise<HaiResult<AuthResult>>;
|
|
1249
|
-
/**
|
|
1250
|
-
* 使用 LDAP 登录
|
|
1251
|
-
*
|
|
1252
|
-
* @param credentials - LDAP 凭证(username + password)
|
|
1253
|
-
* @returns 成功返回 AuthResult(自动同步本地用户);失败返回错误
|
|
1254
|
-
*/
|
|
1255
|
-
loginWithLdap: (credentials: LdapCredentials) => Promise<HaiResult<AuthResult>>;
|
|
1256
|
-
/**
|
|
1257
|
-
* 使用 API Key 登录
|
|
1258
|
-
*
|
|
1259
|
-
* 验证 API Key 有效性 → 查找关联用户 → 按 scopes 收敛授权 → 创建绑定 key 的会话。
|
|
1260
|
-
* 空 scopes 无操作权限;显式 * 也不超出主体权限。受限 key 通过 permission 授权,不保留角色入口。
|
|
1261
|
-
*
|
|
1262
|
-
* @param credentials - API Key 凭证
|
|
1263
|
-
* @returns 成功返回 AuthResult;API Key 无效/过期/禁用返回对应错误
|
|
1264
|
-
*/
|
|
1265
|
-
loginWithApiKey: (credentials: ApiKeyCredentials) => Promise<HaiResult<AuthResult>>;
|
|
1266
|
-
/**
|
|
1267
|
-
* 登出
|
|
1268
|
-
*
|
|
1269
|
-
* 删除会话数据和用户令牌映射。令牌无效时静默成功。
|
|
1270
|
-
*
|
|
1271
|
-
* @param accessToken - 访问令牌
|
|
1272
|
-
* @returns 始终返回 ok
|
|
1273
|
-
*/
|
|
1274
|
-
logout: (accessToken: string) => Promise<HaiResult<void>>;
|
|
1275
|
-
/**
|
|
1276
|
-
* 验证令牌
|
|
1277
|
-
*
|
|
1278
|
-
* 验证会话并读取当前用户状态、角色与权限;重新应用 API Key scopes,依赖失败即拒绝。
|
|
1279
|
-
* 会话同步仅是缓存快照,受保护请求使用此入口而非低层 session.verifyToken。
|
|
1280
|
-
*
|
|
1281
|
-
* @param accessToken - 访问令牌
|
|
1282
|
-
* @returns 成功返回会话信息;令牌无效/过期返回 SESSION_INVALID
|
|
1283
|
-
*/
|
|
1284
|
-
verifyToken: (accessToken: string) => Promise<HaiResult<Session>>;
|
|
1285
|
-
/**
|
|
1286
|
-
* 发送验证码
|
|
1287
|
-
*
|
|
1288
|
-
* @param identifier - 用户标识(邮箱/手机号)
|
|
1289
|
-
* @returns 成功返回验证码过期时间;频率限制返回 OTP_RESEND_TOO_FAST
|
|
1290
|
-
*/
|
|
1291
|
-
sendOtp: (identifier: string) => Promise<HaiResult<{
|
|
1292
|
-
expiresAt: Date;
|
|
1293
|
-
}>>;
|
|
1294
|
-
/**
|
|
1295
|
-
* 注册并登录(一站式)
|
|
1296
|
-
*
|
|
1297
|
-
* 先注册用户(含默认角色分配),成功后立即登录并返回令牌。
|
|
1298
|
-
* 注册失败则直接返回注册错误;注册成功但登录失败则返回登录错误。
|
|
1299
|
-
*
|
|
1300
|
-
* @param options - 注册选项(用户名、密码、邮箱等)
|
|
1301
|
-
* @returns 成功返回 AuthResult(用户信息、令牌、协议展示);失败返回对应错误码
|
|
1302
|
-
*/
|
|
1303
|
-
registerAndLogin: (options: RegisterOptions) => Promise<HaiResult<AuthResult>>;
|
|
1304
|
-
}
|
|
1305
|
-
|
|
1306
|
-
/**
|
|
1307
|
-
* @h-ai/iam — LDAP 认证策略
|
|
1308
|
-
*
|
|
1309
|
-
* LDAP 目录认证方式
|
|
1310
|
-
* @module iam-authn-ldap-strategy
|
|
1311
|
-
*/
|
|
1312
|
-
|
|
1313
|
-
/**
|
|
1314
|
-
* LDAP 客户端接口
|
|
1315
|
-
*/
|
|
1316
|
-
interface LdapClient {
|
|
1317
|
-
/**
|
|
1318
|
-
* 绑定(认证)
|
|
1319
|
-
*/
|
|
1320
|
-
bind: (dn: string, password: string) => Promise<HaiResult<void>>;
|
|
1321
|
-
/**
|
|
1322
|
-
* 搜索用户
|
|
1323
|
-
*/
|
|
1324
|
-
search: (base: string, filter: string, attributes: string[]) => Promise<HaiResult<LdapSearchEntry[]>>;
|
|
1325
|
-
/**
|
|
1326
|
-
* 解除绑定
|
|
1327
|
-
*/
|
|
1328
|
-
unbind: () => Promise<HaiResult<void>>;
|
|
1329
|
-
}
|
|
1330
|
-
/**
|
|
1331
|
-
* LDAP 搜索结果条目
|
|
1332
|
-
*/
|
|
1333
|
-
interface LdapSearchEntry {
|
|
1334
|
-
/** DN */
|
|
1335
|
-
dn: string;
|
|
1336
|
-
/** 属性 */
|
|
1337
|
-
attributes: Record<string, string | string[]>;
|
|
1338
|
-
}
|
|
1339
|
-
/**
|
|
1340
|
-
* LDAP 客户端工厂
|
|
1341
|
-
*/
|
|
1342
|
-
type LdapClientFactory = (config: LdapConfig) => Promise<HaiResult<LdapClient>>;
|
|
1343
|
-
|
|
1344
|
-
/** 提供给认证页面的白名单配置;不含连接信息、密钥及安全状态。 */
|
|
1345
|
-
|
|
1346
|
-
interface IamPublicConfig {
|
|
1347
|
-
/** 页面显示密码策略,不包含密码哈希或账户信息。 */
|
|
1348
|
-
password: ReturnType<typeof PasswordConfigSchema.parse>;
|
|
1349
|
-
register: {
|
|
1350
|
-
enabled: boolean;
|
|
1351
|
-
};
|
|
1352
|
-
/** 方式开关同时考虑配置和发送回调就绪状态,避免展示无法使用的入口。 */
|
|
1353
|
-
login: {
|
|
1354
|
-
password: boolean;
|
|
1355
|
-
otp: boolean;
|
|
1356
|
-
ldap: boolean;
|
|
1357
|
-
email: boolean;
|
|
1358
|
-
sms: boolean;
|
|
1359
|
-
};
|
|
1360
|
-
passwordReset: {
|
|
1361
|
-
enabled: boolean;
|
|
1362
|
-
mode: 'email' | 'phone';
|
|
1363
|
-
};
|
|
1364
|
-
/** 单位:验证码位数、重发间隔秒;安全计数与期限只由服务端执行。 */
|
|
1365
|
-
otp: {
|
|
1366
|
-
length: number;
|
|
1367
|
-
resendInterval: number;
|
|
1368
|
-
};
|
|
1369
|
-
agreements: IamConfig['agreements'];
|
|
1370
|
-
ui: ReturnType<typeof AuthUiConfigSchema.parse>;
|
|
1371
|
-
session: {
|
|
1372
|
-
maxAge: number;
|
|
1373
|
-
};
|
|
1374
|
-
}
|
|
1375
|
-
|
|
1376
|
-
/**
|
|
1377
|
-
* @h-ai/iam — 一次性票据类型
|
|
1378
|
-
*
|
|
1379
|
-
* 定义通用的短期、一次性能力票据(capability ticket):由已认证的上下文签发,
|
|
1380
|
-
* 绑定主体、用途与授权信息,在无法携带 Bearer Token 的通道(如 WebSocket URL)中
|
|
1381
|
-
* 用作一次性入场凭证。典型用途:AI 语音 WebSocket 接入。
|
|
1382
|
-
* @module ticket/iam-ticket-types
|
|
1383
|
-
*/
|
|
1384
|
-
|
|
1385
|
-
/**
|
|
1386
|
-
* 票据授权绑定信息
|
|
1387
|
-
*
|
|
1388
|
-
* 消费时原样返回,供服务端确认本次操作、模型、会话等参数与签发时一致。
|
|
1389
|
-
* 除固定字段外允许应用自定义键值。
|
|
1390
|
-
*/
|
|
1391
|
-
interface TicketGrant {
|
|
1392
|
-
/** 操作类型(如 `'transcribe'` | `'synthesize'` 或应用自定义) */
|
|
1393
|
-
operation?: string;
|
|
1394
|
-
/** 模型 ID */
|
|
1395
|
-
model?: string;
|
|
1396
|
-
/** 会话 ID */
|
|
1397
|
-
sessionId?: string;
|
|
1398
|
-
/** 应用自定义绑定字段 */
|
|
1399
|
-
[key: string]: unknown;
|
|
1400
|
-
}
|
|
1401
|
-
/**
|
|
1402
|
-
* 签发一次性票据的选项
|
|
1403
|
-
*/
|
|
1404
|
-
interface IssueTicketOptions {
|
|
1405
|
-
/** 主体 ID(票据绑定的用户 / 主体,消费时原样返回) */
|
|
1406
|
-
subjectId: string;
|
|
1407
|
-
/** 票据用途(如 `'ai-audio'`),消费时校验一致 */
|
|
1408
|
-
purpose: string;
|
|
1409
|
-
/** 授权绑定信息(操作 / 模型 / 会话等,消费时原样返回) */
|
|
1410
|
-
grant?: TicketGrant;
|
|
1411
|
-
/** 有效期(毫秒,默认 30000) */
|
|
1412
|
-
ttlMs?: number;
|
|
1413
|
-
}
|
|
1414
|
-
/**
|
|
1415
|
-
* 签发结果
|
|
1416
|
-
*/
|
|
1417
|
-
interface IssuedTicket {
|
|
1418
|
-
/** 一次性票据值(密码学安全随机,base64url) */
|
|
1419
|
-
ticket: string;
|
|
1420
|
-
/** 过期时间(Unix 毫秒) */
|
|
1421
|
-
expiresAt: number;
|
|
1422
|
-
}
|
|
1423
|
-
/**
|
|
1424
|
-
* 消费票据的选项
|
|
1425
|
-
*/
|
|
1426
|
-
interface ConsumeTicketOptions {
|
|
1427
|
-
/** 期望用途;与签发用途不一致时返回 `TICKET_INVALID`(防止跨用途重放) */
|
|
1428
|
-
purpose?: string;
|
|
1429
|
-
}
|
|
1430
|
-
/**
|
|
1431
|
-
* 消费结果(校验通过并原子消费后返回)
|
|
1432
|
-
*/
|
|
1433
|
-
interface ConsumedTicket {
|
|
1434
|
-
/** 票据绑定的主体 ID */
|
|
1435
|
-
subjectId: string;
|
|
1436
|
-
/** 票据用途 */
|
|
1437
|
-
purpose: string;
|
|
1438
|
-
/** 授权绑定信息 */
|
|
1439
|
-
grant: TicketGrant;
|
|
1440
|
-
}
|
|
1441
|
-
/**
|
|
1442
|
-
* 一次性票据操作接口(通过 `iam.ticket` 访问)
|
|
1443
|
-
*
|
|
1444
|
-
* 提供密码学安全、带 TTL、原子单次消费的能力票据签发与消费。
|
|
1445
|
-
*/
|
|
1446
|
-
interface TicketOperations {
|
|
1447
|
-
/**
|
|
1448
|
-
* 签发一次性票据
|
|
1449
|
-
*
|
|
1450
|
-
* 生成密码学安全随机值,绑定主体 / 用途 / 授权信息并按 TTL 存入 cache。
|
|
1451
|
-
*
|
|
1452
|
-
* @param options - 签发选项
|
|
1453
|
-
* @returns 票据值与过期时间
|
|
1454
|
-
*/
|
|
1455
|
-
issue: (options: IssueTicketOptions) => Promise<HaiResult<IssuedTicket>>;
|
|
1456
|
-
/**
|
|
1457
|
-
* 原子消费一次性票据
|
|
1458
|
-
*
|
|
1459
|
-
* 单次有效:并发消费同一票据时只有一个成功,其余返回 `TICKET_INVALID`。
|
|
1460
|
-
* 票据不存在 / 已过期 / 已消费 / 用途不匹配时返回错误。
|
|
1461
|
-
*
|
|
1462
|
-
* @param ticket - 票据值
|
|
1463
|
-
* @param options - 消费选项(可校验用途)
|
|
1464
|
-
* @returns 主体 + 用途 + 授权信息
|
|
1465
|
-
*/
|
|
1466
|
-
consume: (ticket: string, options?: ConsumeTicketOptions) => Promise<HaiResult<ConsumedTicket>>;
|
|
1467
|
-
}
|
|
1468
|
-
|
|
1469
|
-
declare const HaiIamError: {
|
|
1470
|
-
readonly AUTH_FAILED: _h_ai_core.HaiErrorDef;
|
|
1471
|
-
readonly INVALID_CREDENTIALS: _h_ai_core.HaiErrorDef;
|
|
1472
|
-
readonly USER_NOT_FOUND: _h_ai_core.HaiErrorDef;
|
|
1473
|
-
readonly USER_DISABLED: _h_ai_core.HaiErrorDef;
|
|
1474
|
-
readonly USER_LOCKED: _h_ai_core.HaiErrorDef;
|
|
1475
|
-
readonly USER_ALREADY_EXISTS: _h_ai_core.HaiErrorDef;
|
|
1476
|
-
readonly PASSWORD_EXPIRED: _h_ai_core.HaiErrorDef;
|
|
1477
|
-
readonly PASSWORD_POLICY_VIOLATION: _h_ai_core.HaiErrorDef;
|
|
1478
|
-
readonly OTP_INVALID: _h_ai_core.HaiErrorDef;
|
|
1479
|
-
readonly NOT_INITIALIZED: _h_ai_core.HaiErrorDef;
|
|
1480
|
-
readonly OTP_RESEND_TOO_FAST: _h_ai_core.HaiErrorDef;
|
|
1481
|
-
readonly LOGIN_DISABLED: _h_ai_core.HaiErrorDef;
|
|
1482
|
-
readonly REGISTER_DISABLED: _h_ai_core.HaiErrorDef;
|
|
1483
|
-
readonly STRATEGY_NOT_SUPPORTED: _h_ai_core.HaiErrorDef;
|
|
1484
|
-
readonly APIKEY_INVALID: _h_ai_core.HaiErrorDef;
|
|
1485
|
-
readonly APIKEY_EXPIRED: _h_ai_core.HaiErrorDef;
|
|
1486
|
-
readonly APIKEY_DISABLED: _h_ai_core.HaiErrorDef;
|
|
1487
|
-
readonly APIKEY_NOT_FOUND: _h_ai_core.HaiErrorDef;
|
|
1488
|
-
readonly RESET_TOKEN_INVALID: _h_ai_core.HaiErrorDef;
|
|
1489
|
-
readonly RESET_TOKEN_EXPIRED: _h_ai_core.HaiErrorDef;
|
|
1490
|
-
readonly RESET_TOKEN_MAX_ATTEMPTS: _h_ai_core.HaiErrorDef;
|
|
1491
|
-
readonly OTP_EXPIRED: _h_ai_core.HaiErrorDef;
|
|
1492
|
-
readonly SECURITY_BUSY: _h_ai_core.HaiErrorDef;
|
|
1493
|
-
readonly PASSWORD_RESET_DISABLED: _h_ai_core.HaiErrorDef;
|
|
1494
|
-
readonly SESSION_NOT_FOUND: _h_ai_core.HaiErrorDef;
|
|
1495
|
-
readonly SESSION_EXPIRED: _h_ai_core.HaiErrorDef;
|
|
1496
|
-
readonly SESSION_INVALID: _h_ai_core.HaiErrorDef;
|
|
1497
|
-
readonly SESSION_CREATE_FAILED: _h_ai_core.HaiErrorDef;
|
|
1498
|
-
readonly TOKEN_EXPIRED: _h_ai_core.HaiErrorDef;
|
|
1499
|
-
readonly TOKEN_INVALID: _h_ai_core.HaiErrorDef;
|
|
1500
|
-
readonly TOKEN_REFRESH_FAILED: _h_ai_core.HaiErrorDef;
|
|
1501
|
-
readonly PERMISSION_DENIED: _h_ai_core.HaiErrorDef;
|
|
1502
|
-
readonly ROLE_NOT_FOUND: _h_ai_core.HaiErrorDef;
|
|
1503
|
-
readonly PERMISSION_NOT_FOUND: _h_ai_core.HaiErrorDef;
|
|
1504
|
-
readonly ROLE_ALREADY_EXISTS: _h_ai_core.HaiErrorDef;
|
|
1505
|
-
readonly PERMISSION_ALREADY_EXISTS: _h_ai_core.HaiErrorDef;
|
|
1506
|
-
readonly LDAP_CONNECTION_FAILED: _h_ai_core.HaiErrorDef;
|
|
1507
|
-
readonly LDAP_BIND_FAILED: _h_ai_core.HaiErrorDef;
|
|
1508
|
-
readonly LDAP_SEARCH_FAILED: _h_ai_core.HaiErrorDef;
|
|
1509
|
-
readonly TICKET_INVALID: _h_ai_core.HaiErrorDef;
|
|
1510
|
-
readonly TICKET_EXPIRED: _h_ai_core.HaiErrorDef;
|
|
1511
|
-
readonly TICKET_ISSUE_FAILED: _h_ai_core.HaiErrorDef;
|
|
1512
|
-
readonly REPOSITORY_ERROR: _h_ai_core.HaiErrorDef;
|
|
1513
|
-
readonly NOT_FOUND: _h_ai_core.HaiErrorDef;
|
|
1514
|
-
readonly CONFLICT: _h_ai_core.HaiErrorDef;
|
|
1515
|
-
readonly FORBIDDEN: _h_ai_core.HaiErrorDef;
|
|
1516
|
-
readonly INVALID_ARGUMENT: _h_ai_core.HaiErrorDef;
|
|
1517
|
-
readonly CONFIG_ERROR: _h_ai_core.HaiErrorDef;
|
|
1518
|
-
readonly INTERNAL_ERROR: _h_ai_core.HaiErrorDef;
|
|
1519
|
-
};
|
|
1520
|
-
/**
|
|
1521
|
-
* IAM 初始化配置
|
|
1522
|
-
*
|
|
1523
|
-
* 包含 Zod 校验的设置字段和运行时依赖。
|
|
1524
|
-
* 传入 `iam.init()` 的唯一参数。
|
|
1525
|
-
*/
|
|
1526
|
-
interface IamConfigInput extends IamConfigSettingsInput {
|
|
1527
|
-
/**
|
|
1528
|
-
* 可选、已初始化的触达模块;由应用安装并注入,IAM 不导入或关闭该模块。
|
|
1529
|
-
* 自动使用 otp_email、otp_sms、password_reset、password_reset_sms 模板;显式发送回调优先。
|
|
1530
|
-
*/
|
|
1531
|
-
reach?: ReachFunctions;
|
|
1532
|
-
/** LDAP 客户端工厂(可选);启用 LDAP 且未注入时才加载应用安装的 ldapts。 */
|
|
1533
|
-
ldapClientFactory?: LdapClientFactory;
|
|
1534
|
-
/** LDAP 用户同步开关(默认 true) */
|
|
1535
|
-
ldapSyncUser?: boolean;
|
|
1536
|
-
/**
|
|
1537
|
-
* 密码重置令牌回调(可选)
|
|
1538
|
-
*
|
|
1539
|
-
* 当用户请求密码重置时,框架生成令牌后通过此回调通知业务层,
|
|
1540
|
-
* 业务层负责将令牌通过邮件/短信等渠道发送给用户。
|
|
1541
|
-
* 也可传入已初始化的 reach 自动发送;两者均未配置时重置功能不可用。
|
|
1542
|
-
*
|
|
1543
|
-
* @param user - 请求重置的用户信息
|
|
1544
|
-
* @param token - 重置令牌(明文,需发送给用户)
|
|
1545
|
-
* @param expiresAt - 令牌过期时间
|
|
1546
|
-
*/
|
|
1547
|
-
onPasswordResetRequest?: (user: User, token: string, expiresAt: Date) => Promise<void>;
|
|
1548
|
-
/**
|
|
1549
|
-
* OTP 邮件验证码发送回调(可选)
|
|
1550
|
-
*
|
|
1551
|
-
* 当用户请求 OTP 验证码时,框架生成验证码后通过此回调通知业务层,
|
|
1552
|
-
* 业务层负责将验证码通过邮件发送给用户。
|
|
1553
|
-
* 显式回调覆盖 Reach 的 otp_email 模板;两者均不可用时该登录入口关闭。
|
|
1554
|
-
* 投递失败须拒绝 Promise,异常由 IAM 转为业务结果,不要在回调中吞掉失败。
|
|
1555
|
-
*
|
|
1556
|
-
* @param email - 目标邮箱
|
|
1557
|
-
* @param code - 验证码
|
|
1558
|
-
*/
|
|
1559
|
-
onOtpSendEmail?: (email: string, code: string) => Promise<void>;
|
|
1560
|
-
/**
|
|
1561
|
-
* OTP 短信验证码发送回调(可选)
|
|
1562
|
-
*
|
|
1563
|
-
* 当用户请求 OTP 验证码时,框架生成验证码后通过此回调通知业务层,
|
|
1564
|
-
* 业务层负责将验证码通过短信发送给用户。
|
|
1565
|
-
* 显式回调覆盖 Reach 的 otp_sms 模板;两者均不可用时该登录入口关闭。
|
|
1566
|
-
* 投递失败须拒绝 Promise,异常由 IAM 转为业务结果,不要在回调中吞掉失败。
|
|
1567
|
-
*
|
|
1568
|
-
* @param phone - 目标手机号
|
|
1569
|
-
* @param code - 验证码
|
|
1570
|
-
*/
|
|
1571
|
-
onOtpSendSms?: (phone: string, code: string) => Promise<void>;
|
|
1572
|
-
}
|
|
1573
|
-
/**
|
|
1574
|
-
* IAM 函数接口
|
|
1575
|
-
*
|
|
1576
|
-
* 统一聚合所有 IAM 功能。
|
|
1577
|
-
*/
|
|
1578
|
-
interface IamFunctions {
|
|
1579
|
-
/**
|
|
1580
|
-
* 初始化 IAM 服务
|
|
1581
|
-
*
|
|
1582
|
-
* 已初始化时先关闭旧内部状态再重新初始化;并发初始化返回配置错误。
|
|
1583
|
-
* 内部按依赖顺序创建 session → authz → authn → user 子功能,
|
|
1584
|
-
* 并可选执行种子数据初始化。
|
|
1585
|
-
*
|
|
1586
|
-
* @param config - IAM 初始化配置(可选 session/password/LDAP 等策略配置)
|
|
1587
|
-
* @returns 成功返回 `ok(undefined)`;失败返回含错误码的 `err`
|
|
1588
|
-
*
|
|
1589
|
-
* @example
|
|
1590
|
-
* ```ts
|
|
1591
|
-
* const result = await iam.init({ session: { maxAge: 86400 } })
|
|
1592
|
-
* if (!result.success) {
|
|
1593
|
-
* console.error(result.error.message)
|
|
1594
|
-
* }
|
|
1595
|
-
* ```
|
|
1596
|
-
*/
|
|
1597
|
-
init: (config: IamConfigInput) => Promise<HaiResult<void>>;
|
|
1598
|
-
/**
|
|
1599
|
-
* 关闭 IAM 服务
|
|
1600
|
-
*
|
|
1601
|
-
* 释放所有内部子功能引用,将模块恢复到未初始化状态。
|
|
1602
|
-
* 关闭后访问 `iam.auth` 等属性将返回未初始化错误。
|
|
1603
|
-
*/
|
|
1604
|
-
close: () => Promise<void>;
|
|
1605
|
-
/** 当前脱敏后的配置快照(未初始化时为 null) */
|
|
1606
|
-
readonly config: IamConfig | null;
|
|
1607
|
-
/** 安全且反映实际可用能力的认证页面配置。 */
|
|
1608
|
-
readonly publicConfig: IamPublicConfig | null;
|
|
1609
|
-
/** 是否已初始化 */
|
|
1610
|
-
readonly isInitialized: boolean;
|
|
1611
|
-
/** 注册功能是否启用(未初始化或未配置时默认启用) */
|
|
1612
|
-
readonly isRegisterEnabled: boolean;
|
|
1613
|
-
/** 认证操作(登录、登出、令牌验证等) */
|
|
1614
|
-
readonly auth: AuthnOperations;
|
|
1615
|
-
/** 用户管理(注册、查询、更新、密码管理等) */
|
|
1616
|
-
readonly user: UserOperations;
|
|
1617
|
-
/** 授权管理(角色/权限 CRUD、用户角色分配、权限检查) */
|
|
1618
|
-
readonly authz: AuthzOperations;
|
|
1619
|
-
/** 会话管理(创建、查询、验证、删除会话) */
|
|
1620
|
-
readonly session: SessionOperations;
|
|
1621
|
-
/** API Key 管理(创建、列表、吐销、验证),未启用 apikey 登录时返回未初始化代理 */
|
|
1622
|
-
readonly apiKey: ApiKeyOperations;
|
|
1623
|
-
/** 一次性能力票据(签发 / 原子消费短期票据,用于 WebSocket 等无法携带 Bearer Token 的通道) */
|
|
1624
|
-
readonly ticket: TicketOperations;
|
|
1625
|
-
}
|
|
1626
|
-
|
|
1627
|
-
/**
|
|
1628
|
-
* @h-ai/iam — IAM 服务主入口
|
|
1629
|
-
*
|
|
1630
|
-
* 管理运行时状态、实现生命周期(init / close)、通过 get 访问器暴露子功能。
|
|
1631
|
-
* @module iam-main
|
|
1632
|
-
*/
|
|
1633
|
-
|
|
1634
30
|
declare const iam: IamFunctions;
|
|
1635
31
|
|
|
1636
|
-
export {
|
|
32
|
+
export { IamFunctions, iam };
|