@zlooks.cn/password-auth-server 1.0.8 → 1.1.0
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/.hile-rsc/{build-mu23gtxh-f44b8610/client-browser/chunks/chunk-KAAF6QZA.js → build-mu41ll5m-02df9102/client-browser/chunks/chunk-ZV6MPT36.js} +62 -6
- package/.hile-rsc/{build-mu23gtxh-f44b8610/client-browser/src-plugin-page-frame-07c4de56a6-CUBFIRPZ.js → build-mu41ll5m-02df9102/client-browser/src-plugin-page-frame-07c4de56a6-24L24OGL.js} +1 -1
- package/.hile-rsc/{build-mu23gtxh-f44b8610/client-browser/src-plugin-password-form-3bd63d69e5-JSE7BG7B.js → build-mu41ll5m-02df9102/client-browser/src-plugin-password-form-3bd63d69e5-MO3JJSBS.js} +93 -87
- package/.hile-rsc/{build-mu23gtxh-f44b8610/client-ssr/chunks/chunk-CO2NBEJ7.js → build-mu41ll5m-02df9102/client-ssr/chunks/chunk-EWBYMJX4.js} +63 -7
- package/.hile-rsc/{build-mu23gtxh-f44b8610/client-ssr/src-plugin-page-frame-07c4de56a6-UJSSLASH.js → build-mu41ll5m-02df9102/client-ssr/src-plugin-page-frame-07c4de56a6-LN2W67ZP.js} +1 -1
- package/.hile-rsc/{build-mu23gtxh-f44b8610/client-ssr/src-plugin-password-form-3bd63d69e5-YEIM2464.js → build-mu41ll5m-02df9102/client-ssr/src-plugin-password-form-3bd63d69e5-MWQ7H3E5.js} +93 -87
- package/.hile-rsc/build-mu41ll5m-02df9102/plugin.json +126 -0
- package/.hile-rsc/{build-mu23gtxh-f44b8610 → build-mu41ll5m-02df9102}/server-rsc/index.js +94 -88
- package/dist/password/password-authenticator.d.ts +4 -1
- package/dist/password/password-authenticator.d.ts.map +1 -1
- package/dist/password/password-authenticator.js +62 -9
- package/dist/password/password-authenticator.js.map +1 -1
- package/dist/password/typeorm-credential-repository.d.ts.map +1 -1
- package/dist/password/typeorm-credential-repository.js +11 -46
- package/dist/password/typeorm-credential-repository.js.map +1 -1
- package/dist/persistence/entities.d.ts +1 -12
- package/dist/persistence/entities.d.ts.map +1 -1
- package/dist/persistence/entities.js +0 -16
- package/dist/persistence/entities.js.map +1 -1
- package/dist/services/application.service.d.ts.map +1 -1
- package/dist/services/application.service.js +2 -1
- package/dist/services/application.service.js.map +1 -1
- package/dist/services/password-runtime.service.d.ts.map +1 -1
- package/dist/services/password-runtime.service.js +7 -17
- package/dist/services/password-runtime.service.js.map +1 -1
- package/package.json +11 -9
- package/.hile-rsc/build-mu23gtxh-f44b8610/plugin.json +0 -90
- package/dist/password/credential-lifecycle-outbox.d.ts +0 -42
- package/dist/password/credential-lifecycle-outbox.d.ts.map +0 -1
- package/dist/password/credential-lifecycle-outbox.js +0 -120
- package/dist/password/credential-lifecycle-outbox.js.map +0 -1
- /package/.hile-rsc/{build-mu23gtxh-f44b8610 → build-mu41ll5m-02df9102}/client-browser/src-plugin-page-frame-07c4de56a6-3F24AYCH.css +0 -0
- /package/.hile-rsc/{build-mu23gtxh-f44b8610 → build-mu41ll5m-02df9102}/client-browser/src-plugin-password-form-3bd63d69e5-TRYMJX4F.css +0 -0
- /package/.hile-rsc/{build-mu23gtxh-f44b8610 → build-mu41ll5m-02df9102}/styles/4b3193c4f2b317ffed425ccf401342a4bdd6ccfd5f9c42def3315e776f166975.css +0 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
{
|
|
2
|
+
"protocolVersion": 1,
|
|
3
|
+
"pluginId": "auth.password",
|
|
4
|
+
"buildId": "build-mu41ll5m-02df9102",
|
|
5
|
+
"runtime": {
|
|
6
|
+
"react": "19.2.8",
|
|
7
|
+
"reactDom": "19.2.8",
|
|
8
|
+
"rsc": "19.2.8"
|
|
9
|
+
},
|
|
10
|
+
"server": {
|
|
11
|
+
"entry": "server-rsc/index.js",
|
|
12
|
+
"integrity": "sha256-l3h8Daulm0BJfwweeHGhbAFzeCJQeZDNBc9A8EnKzS0=",
|
|
13
|
+
"size": 595248
|
|
14
|
+
},
|
|
15
|
+
"serverFunctions": [],
|
|
16
|
+
"clients": [
|
|
17
|
+
{
|
|
18
|
+
"id": "auth.password/src/plugin/page-frame#default",
|
|
19
|
+
"module": "client-browser/src-plugin-page-frame-07c4de56a6-24L24OGL.js",
|
|
20
|
+
"ssrModule": "client-ssr/src-plugin-page-frame-07c4de56a6-LN2W67ZP.js",
|
|
21
|
+
"exportName": "default",
|
|
22
|
+
"chunks": [
|
|
23
|
+
{
|
|
24
|
+
"path": "client-browser/chunks/chunk-ZV6MPT36.js",
|
|
25
|
+
"integrity": "sha256-nBXxFdtW/TJZ6rL/qjXWf5b+9f50eyolwgQ/wqK5sWY=",
|
|
26
|
+
"size": 1454536
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"ssrChunks": [
|
|
30
|
+
{
|
|
31
|
+
"path": "client-ssr/chunks/chunk-EWBYMJX4.js",
|
|
32
|
+
"integrity": "sha256-y7EBbPKD/jls8C9T0gvbLPfJIrExxjKI0HMRkgdZPxY=",
|
|
33
|
+
"size": 1382378
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"integrity": "sha256-BWhlIHmeEVS/NRaX2+CNwsIyFp6VPhPVSnTwLNzaNa8=",
|
|
37
|
+
"ssrIntegrity": "sha256-5LLawGustoilEMLuktDShS7ceVc45e9d7yPSdyHlVT4=",
|
|
38
|
+
"size": 81661,
|
|
39
|
+
"ssrSize": 525253,
|
|
40
|
+
"styles": [
|
|
41
|
+
"client-browser/src-plugin-page-frame-07c4de56a6-3F24AYCH.css"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "auth.password/src/plugin/password-form#default",
|
|
46
|
+
"module": "client-browser/src-plugin-password-form-3bd63d69e5-MO3JJSBS.js",
|
|
47
|
+
"ssrModule": "client-ssr/src-plugin-password-form-3bd63d69e5-MWQ7H3E5.js",
|
|
48
|
+
"exportName": "default",
|
|
49
|
+
"chunks": [
|
|
50
|
+
{
|
|
51
|
+
"path": "client-browser/chunks/chunk-ZV6MPT36.js",
|
|
52
|
+
"integrity": "sha256-nBXxFdtW/TJZ6rL/qjXWf5b+9f50eyolwgQ/wqK5sWY=",
|
|
53
|
+
"size": 1454536
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"ssrChunks": [
|
|
57
|
+
{
|
|
58
|
+
"path": "client-ssr/chunks/chunk-EWBYMJX4.js",
|
|
59
|
+
"integrity": "sha256-y7EBbPKD/jls8C9T0gvbLPfJIrExxjKI0HMRkgdZPxY=",
|
|
60
|
+
"size": 1382378
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
"integrity": "sha256-GCIqr29sGLCZaBQxRIlPxAgxZ+aGCjDBHc79SryUVLE=",
|
|
64
|
+
"ssrIntegrity": "sha256-/VE2aLgO1pj4K4yr0J9owOOZsSNScwDnvM16yX+5IpI=",
|
|
65
|
+
"size": 173584,
|
|
66
|
+
"ssrSize": 4801433,
|
|
67
|
+
"styles": [
|
|
68
|
+
"client-browser/src-plugin-password-form-3bd63d69e5-TRYMJX4F.css"
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
],
|
|
72
|
+
"styles": [
|
|
73
|
+
{
|
|
74
|
+
"path": "styles/4b3193c4f2b317ffed425ccf401342a4bdd6ccfd5f9c42def3315e776f166975.css",
|
|
75
|
+
"integrity": "sha256-SzGTxPKzF//tQlzPQBNCpL3WzP1fnELe8zFed28WaXU=",
|
|
76
|
+
"size": 1266149,
|
|
77
|
+
"scope": "plugin"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"path": "client-browser/src-plugin-page-frame-07c4de56a6-3F24AYCH.css",
|
|
81
|
+
"integrity": "sha256-qGzKKqMEGOzq9wFBdXLCZAHsAMbgCw24JBtE3BN2EWA=",
|
|
82
|
+
"size": 3891,
|
|
83
|
+
"scope": "client"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"path": "client-browser/src-plugin-password-form-3bd63d69e5-TRYMJX4F.css",
|
|
87
|
+
"integrity": "sha256-M4Xlrb9ikrWsYdYw6ynS4Fq8tVTCeq1Jab1Ta2FcLMA=",
|
|
88
|
+
"size": 4545,
|
|
89
|
+
"scope": "client"
|
|
90
|
+
}
|
|
91
|
+
],
|
|
92
|
+
"routes": [
|
|
93
|
+
{
|
|
94
|
+
"path": "/login",
|
|
95
|
+
"entry": "LoginPage",
|
|
96
|
+
"prefetch": "assets",
|
|
97
|
+
"clientReferences": [
|
|
98
|
+
"auth.password/src/plugin/page-frame#default",
|
|
99
|
+
"auth.password/src/plugin/password-form#default"
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"path": "/register",
|
|
104
|
+
"entry": "RegistrationPage",
|
|
105
|
+
"prefetch": "assets",
|
|
106
|
+
"clientReferences": [
|
|
107
|
+
"auth.password/src/plugin/page-frame#default",
|
|
108
|
+
"auth.password/src/plugin/password-form#default"
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"path": "/recovery",
|
|
113
|
+
"entry": "RecoveryPage",
|
|
114
|
+
"prefetch": "assets",
|
|
115
|
+
"clientReferences": [
|
|
116
|
+
"auth.password/src/plugin/page-frame#default",
|
|
117
|
+
"auth.password/src/plugin/password-form#default"
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
],
|
|
121
|
+
"metadata": {
|
|
122
|
+
"displayName": "密码认证",
|
|
123
|
+
"description": "邮箱密码、验证码登录、注册及找回密码组件",
|
|
124
|
+
"navigation": []
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -14844,92 +14844,6 @@ function isBrowserApiFailure(response) {
|
|
|
14844
14844
|
return response.code !== 0;
|
|
14845
14845
|
}
|
|
14846
14846
|
|
|
14847
|
-
// ../user-shared/dist/identity.js
|
|
14848
|
-
var USER_SERVICE_NAMESPACE = "cn.zlooks.user.server";
|
|
14849
|
-
|
|
14850
|
-
// ../user-shared/dist/events/snapshots.js
|
|
14851
|
-
var userSessionRevocationReasonSchema = external_exports.enum([
|
|
14852
|
-
"logout",
|
|
14853
|
-
"user-request",
|
|
14854
|
-
"family-limit",
|
|
14855
|
-
"credential-recovery"
|
|
14856
|
-
]);
|
|
14857
|
-
var displayNameSchema = external_exports.string().refine((value) => value === value.trim().normalize("NFKC"), "Display name must be normalized").refine((value) => Array.from(value).length >= 1 && Array.from(value).length <= 160, "Display name must contain 1 to 160 Unicode code points");
|
|
14858
|
-
var bioSchema = external_exports.string().refine((value) => value === value.trim().normalize("NFKC"), "Bio must be normalized").refine((value) => Array.from(value).length >= 1 && Array.from(value).length <= 500, "Bio must contain 1 to 500 Unicode code points");
|
|
14859
|
-
var httpUrlSchema = external_exports.url().max(2048).refine((value) => {
|
|
14860
|
-
const protocol = new URL(value).protocol;
|
|
14861
|
-
return protocol === "http:" || protocol === "https:";
|
|
14862
|
-
}, "URL must use HTTP or HTTPS").refine((value) => value === new URL(value).toString(), "URL must be canonical");
|
|
14863
|
-
var emailSchema = external_exports.email().max(320).refine((value) => value === value.toLocaleLowerCase("en-US"), "Email must be lowercase");
|
|
14864
|
-
var userEventSnapshotSchema = external_exports.strictObject({
|
|
14865
|
-
id: external_exports.uuid(),
|
|
14866
|
-
displayName: displayNameSchema.nullable(),
|
|
14867
|
-
avatar: httpUrlSchema.nullable(),
|
|
14868
|
-
homepage: httpUrlSchema.nullable(),
|
|
14869
|
-
bio: bioSchema.nullable(),
|
|
14870
|
-
email: emailSchema.nullable(),
|
|
14871
|
-
emailVerified: external_exports.boolean(),
|
|
14872
|
-
status: external_exports.enum(["active", "disabled", "deleted"]),
|
|
14873
|
-
createdAt: external_exports.iso.datetime({ offset: true }),
|
|
14874
|
-
updatedAt: external_exports.iso.datetime({ offset: true }),
|
|
14875
|
-
version: external_exports.number().int().positive()
|
|
14876
|
-
}).superRefine((user, context) => {
|
|
14877
|
-
if (user.emailVerified && user.email === null) {
|
|
14878
|
-
context.addIssue({
|
|
14879
|
-
code: "custom",
|
|
14880
|
-
message: "A verified user snapshot must include its email",
|
|
14881
|
-
path: ["email"]
|
|
14882
|
-
});
|
|
14883
|
-
}
|
|
14884
|
-
if (Date.parse(user.updatedAt) < Date.parse(user.createdAt)) {
|
|
14885
|
-
context.addIssue({
|
|
14886
|
-
code: "custom",
|
|
14887
|
-
message: "User updated time must not precede creation time",
|
|
14888
|
-
path: ["updatedAt"]
|
|
14889
|
-
});
|
|
14890
|
-
}
|
|
14891
|
-
}).readonly();
|
|
14892
|
-
var userSessionFamilyEventSnapshotSchema = external_exports.strictObject({
|
|
14893
|
-
id: external_exports.uuid(),
|
|
14894
|
-
userId: external_exports.uuid(),
|
|
14895
|
-
createdAt: external_exports.iso.datetime({ offset: true }),
|
|
14896
|
-
expiresAt: external_exports.iso.datetime({ offset: true }),
|
|
14897
|
-
lastSeenAt: external_exports.iso.datetime({ offset: true }),
|
|
14898
|
-
revokedAt: external_exports.iso.datetime({ offset: true }).nullable(),
|
|
14899
|
-
revokeReason: userSessionRevocationReasonSchema.nullable()
|
|
14900
|
-
}).superRefine((session, context) => {
|
|
14901
|
-
const createdAt = Date.parse(session.createdAt);
|
|
14902
|
-
if (session.revokedAt === null !== (session.revokeReason === null)) {
|
|
14903
|
-
context.addIssue({
|
|
14904
|
-
code: "custom",
|
|
14905
|
-
message: "Session revocation time and reason must be present together",
|
|
14906
|
-
path: ["revokedAt"]
|
|
14907
|
-
});
|
|
14908
|
-
}
|
|
14909
|
-
if (Date.parse(session.expiresAt) <= createdAt) {
|
|
14910
|
-
context.addIssue({
|
|
14911
|
-
code: "custom",
|
|
14912
|
-
message: "Session expiry must follow creation time",
|
|
14913
|
-
path: ["expiresAt"]
|
|
14914
|
-
});
|
|
14915
|
-
}
|
|
14916
|
-
const lastSeenAt = Date.parse(session.lastSeenAt);
|
|
14917
|
-
if (lastSeenAt < createdAt || lastSeenAt > Date.parse(session.expiresAt)) {
|
|
14918
|
-
context.addIssue({
|
|
14919
|
-
code: "custom",
|
|
14920
|
-
message: "Session last-seen time must fall within its lifetime",
|
|
14921
|
-
path: ["lastSeenAt"]
|
|
14922
|
-
});
|
|
14923
|
-
}
|
|
14924
|
-
if (session.revokedAt !== null && Date.parse(session.revokedAt) < createdAt) {
|
|
14925
|
-
context.addIssue({
|
|
14926
|
-
code: "custom",
|
|
14927
|
-
message: "Session revoked time must not precede creation time",
|
|
14928
|
-
path: ["revokedAt"]
|
|
14929
|
-
});
|
|
14930
|
-
}
|
|
14931
|
-
}).readonly();
|
|
14932
|
-
|
|
14933
14847
|
// ../event-bus/dist/index.js
|
|
14934
14848
|
var EVENT_PROTOCOL = "zlooks.event";
|
|
14935
14849
|
var EVENT_PROTOCOL_VERSION = 1;
|
|
@@ -15072,6 +14986,92 @@ function isRecord(value) {
|
|
|
15072
14986
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
15073
14987
|
}
|
|
15074
14988
|
|
|
14989
|
+
// ../user-shared/dist/identity.js
|
|
14990
|
+
var USER_SERVICE_NAMESPACE = "cn.zlooks.user.server";
|
|
14991
|
+
|
|
14992
|
+
// ../user-shared/dist/events/snapshots.js
|
|
14993
|
+
var userSessionRevocationReasonSchema = external_exports.enum([
|
|
14994
|
+
"logout",
|
|
14995
|
+
"user-request",
|
|
14996
|
+
"family-limit",
|
|
14997
|
+
"credential-recovery"
|
|
14998
|
+
]);
|
|
14999
|
+
var displayNameSchema = external_exports.string().refine((value) => value === value.trim().normalize("NFKC"), "Display name must be normalized").refine((value) => Array.from(value).length >= 1 && Array.from(value).length <= 160, "Display name must contain 1 to 160 Unicode code points");
|
|
15000
|
+
var bioSchema = external_exports.string().refine((value) => value === value.trim().normalize("NFKC"), "Bio must be normalized").refine((value) => Array.from(value).length >= 1 && Array.from(value).length <= 500, "Bio must contain 1 to 500 Unicode code points");
|
|
15001
|
+
var httpUrlSchema = external_exports.url().max(2048).refine((value) => {
|
|
15002
|
+
const protocol = new URL(value).protocol;
|
|
15003
|
+
return protocol === "http:" || protocol === "https:";
|
|
15004
|
+
}, "URL must use HTTP or HTTPS").refine((value) => value === new URL(value).toString(), "URL must be canonical");
|
|
15005
|
+
var emailSchema = external_exports.email().max(320).refine((value) => value === value.toLocaleLowerCase("en-US"), "Email must be lowercase");
|
|
15006
|
+
var userEventSnapshotSchema = external_exports.strictObject({
|
|
15007
|
+
id: external_exports.uuid(),
|
|
15008
|
+
displayName: displayNameSchema.nullable(),
|
|
15009
|
+
avatar: httpUrlSchema.nullable(),
|
|
15010
|
+
homepage: httpUrlSchema.nullable(),
|
|
15011
|
+
bio: bioSchema.nullable(),
|
|
15012
|
+
email: emailSchema.nullable(),
|
|
15013
|
+
emailVerified: external_exports.boolean(),
|
|
15014
|
+
status: external_exports.enum(["active", "disabled", "deleted"]),
|
|
15015
|
+
createdAt: external_exports.iso.datetime({ offset: true }),
|
|
15016
|
+
updatedAt: external_exports.iso.datetime({ offset: true }),
|
|
15017
|
+
version: external_exports.number().int().positive()
|
|
15018
|
+
}).superRefine((user, context) => {
|
|
15019
|
+
if (user.emailVerified && user.email === null) {
|
|
15020
|
+
context.addIssue({
|
|
15021
|
+
code: "custom",
|
|
15022
|
+
message: "A verified user snapshot must include its email",
|
|
15023
|
+
path: ["email"]
|
|
15024
|
+
});
|
|
15025
|
+
}
|
|
15026
|
+
if (Date.parse(user.updatedAt) < Date.parse(user.createdAt)) {
|
|
15027
|
+
context.addIssue({
|
|
15028
|
+
code: "custom",
|
|
15029
|
+
message: "User updated time must not precede creation time",
|
|
15030
|
+
path: ["updatedAt"]
|
|
15031
|
+
});
|
|
15032
|
+
}
|
|
15033
|
+
}).readonly();
|
|
15034
|
+
var userSessionFamilyEventSnapshotSchema = external_exports.strictObject({
|
|
15035
|
+
id: external_exports.uuid(),
|
|
15036
|
+
userId: external_exports.uuid(),
|
|
15037
|
+
createdAt: external_exports.iso.datetime({ offset: true }),
|
|
15038
|
+
expiresAt: external_exports.iso.datetime({ offset: true }),
|
|
15039
|
+
lastSeenAt: external_exports.iso.datetime({ offset: true }),
|
|
15040
|
+
revokedAt: external_exports.iso.datetime({ offset: true }).nullable(),
|
|
15041
|
+
revokeReason: userSessionRevocationReasonSchema.nullable()
|
|
15042
|
+
}).superRefine((session, context) => {
|
|
15043
|
+
const createdAt = Date.parse(session.createdAt);
|
|
15044
|
+
if (session.revokedAt === null !== (session.revokeReason === null)) {
|
|
15045
|
+
context.addIssue({
|
|
15046
|
+
code: "custom",
|
|
15047
|
+
message: "Session revocation time and reason must be present together",
|
|
15048
|
+
path: ["revokedAt"]
|
|
15049
|
+
});
|
|
15050
|
+
}
|
|
15051
|
+
if (Date.parse(session.expiresAt) <= createdAt) {
|
|
15052
|
+
context.addIssue({
|
|
15053
|
+
code: "custom",
|
|
15054
|
+
message: "Session expiry must follow creation time",
|
|
15055
|
+
path: ["expiresAt"]
|
|
15056
|
+
});
|
|
15057
|
+
}
|
|
15058
|
+
const lastSeenAt = Date.parse(session.lastSeenAt);
|
|
15059
|
+
if (lastSeenAt < createdAt || lastSeenAt > Date.parse(session.expiresAt)) {
|
|
15060
|
+
context.addIssue({
|
|
15061
|
+
code: "custom",
|
|
15062
|
+
message: "Session last-seen time must fall within its lifetime",
|
|
15063
|
+
path: ["lastSeenAt"]
|
|
15064
|
+
});
|
|
15065
|
+
}
|
|
15066
|
+
if (session.revokedAt !== null && Date.parse(session.revokedAt) < createdAt) {
|
|
15067
|
+
context.addIssue({
|
|
15068
|
+
code: "custom",
|
|
15069
|
+
message: "Session revoked time must not precede creation time",
|
|
15070
|
+
path: ["revokedAt"]
|
|
15071
|
+
});
|
|
15072
|
+
}
|
|
15073
|
+
}).readonly();
|
|
15074
|
+
|
|
15075
15075
|
// ../user-shared/dist/events/definition.js
|
|
15076
15076
|
function defineUserEvent(type, aggregateType2, dataSchema5, aggregateId2) {
|
|
15077
15077
|
return defineEvent(type, dataSchema5, {
|
|
@@ -15203,6 +15203,7 @@ var USER_EVENT_CATALOG = defineEventCatalog({
|
|
|
15203
15203
|
|
|
15204
15204
|
// ../user-shared/dist/index.js
|
|
15205
15205
|
var USER_CREDENTIAL_LIFECYCLE_PROTOCOL = "zlooks.user.credential-lifecycle";
|
|
15206
|
+
var USER_CREDENTIAL_LIFECYCLE_EVENT_TYPE = "cn.zlooks.password.credential-lifecycle.v1";
|
|
15206
15207
|
var USER_BROWSER_AUTH_METHODS_PATH = browserApiPath(USER_SERVICE_NAMESPACE, "/api/auth/methods");
|
|
15207
15208
|
var USER_BROWSER_AUTH_TRANSACTIONS_PATH = browserApiPath(USER_SERVICE_NAMESPACE, "/api/auth/transactions");
|
|
15208
15209
|
var USER_BROWSER_LOGOUT_PATH = browserApiPath(USER_SERVICE_NAMESPACE, "/api/auth/logout");
|
|
@@ -15425,6 +15426,11 @@ var userCredentialLifecycleEventSchema = external_exports.strictObject({
|
|
|
15425
15426
|
email: external_exports.email().max(320),
|
|
15426
15427
|
occurredAt: external_exports.iso.datetime({ offset: true })
|
|
15427
15428
|
}).readonly();
|
|
15429
|
+
var userCredentialLifecycleDomainEvent = defineEvent(USER_CREDENTIAL_LIFECYCLE_EVENT_TYPE, userCredentialLifecycleEventSchema, {
|
|
15430
|
+
producer: "cn.zlooks.password.auth.server",
|
|
15431
|
+
aggregateType: "credential",
|
|
15432
|
+
aggregateId: ({ subject }) => subject
|
|
15433
|
+
});
|
|
15428
15434
|
var userCredentialLifecycleResponseSchema = external_exports.strictObject({
|
|
15429
15435
|
acknowledged: external_exports.literal(true)
|
|
15430
15436
|
}).readonly();
|
|
@@ -15499,7 +15505,7 @@ var __hileRemoteClientBoundary = __hileRegisterClientReference(function() {
|
|
|
15499
15505
|
function __hileDefault(props) {
|
|
15500
15506
|
return React.createElement(__hileRemoteClientBoundary, {
|
|
15501
15507
|
pluginId: "auth.password",
|
|
15502
|
-
buildId: "build-
|
|
15508
|
+
buildId: "build-mu41ll5m-02df9102",
|
|
15503
15509
|
referenceId: "auth.password/src/plugin/password-form#default",
|
|
15504
15510
|
exportName: "default",
|
|
15505
15511
|
props
|
|
@@ -15516,7 +15522,7 @@ var __hileRemoteClientBoundary2 = __hileRegisterClientReference2(function() {
|
|
|
15516
15522
|
function __hileDefault2(props) {
|
|
15517
15523
|
return React2.createElement(__hileRemoteClientBoundary2, {
|
|
15518
15524
|
pluginId: "auth.password",
|
|
15519
|
-
buildId: "build-
|
|
15525
|
+
buildId: "build-mu41ll5m-02df9102",
|
|
15520
15526
|
referenceId: "auth.password/src/plugin/page-frame#default",
|
|
15521
15527
|
exportName: "default",
|
|
15522
15528
|
props
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { DomainEventPublisher } from '@zlooks.cn/event-client';
|
|
1
2
|
import type { PasswordAuthConfig } from '../config/schema.js';
|
|
2
3
|
import type { PasswordCredentialRepository } from './credential-repository.js';
|
|
3
4
|
import type { PasswordAttemptCoordinator } from './attempt-coordinator.js';
|
|
@@ -25,8 +26,9 @@ export declare class PasswordAuthenticator {
|
|
|
25
26
|
private readonly unknownCredentialHash;
|
|
26
27
|
private readonly clock;
|
|
27
28
|
private readonly attemptCoordinator?;
|
|
29
|
+
private readonly lifecycleEvents?;
|
|
28
30
|
private constructor();
|
|
29
|
-
static create(repository: PasswordCredentialRepository, policy: PasswordPolicy, clock?: () => Date, attemptCoordinator?: PasswordAttemptCoordinator): Promise<PasswordAuthenticator>;
|
|
31
|
+
static create(repository: PasswordCredentialRepository, policy: PasswordPolicy, clock?: () => Date, attemptCoordinator?: PasswordAttemptCoordinator, lifecycleEvents?: DomainEventPublisher): Promise<PasswordAuthenticator>;
|
|
30
32
|
register(input: {
|
|
31
33
|
readonly identifier: string;
|
|
32
34
|
readonly password: string;
|
|
@@ -53,6 +55,7 @@ export declare class PasswordAuthenticator {
|
|
|
53
55
|
readonly identifier: string;
|
|
54
56
|
readonly password: string;
|
|
55
57
|
}): Promise<VerificationResult>;
|
|
58
|
+
private publishLifecycleEvent;
|
|
56
59
|
}
|
|
57
60
|
export declare function normalizeEmailIdentifier(value: string): string | undefined;
|
|
58
61
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-authenticator.d.ts","sourceRoot":"","sources":["../../src/password/password-authenticator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"password-authenticator.d.ts","sourceRoot":"","sources":["../../src/password/password-authenticator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
import { randomBytes, randomUUID } from 'node:crypto';
|
|
2
2
|
import { hash, verify } from '@node-rs/argon2';
|
|
3
|
+
import { createUserCredentialLifecycleDomainEvent, USER_CREDENTIAL_LIFECYCLE_PROTOCOL, } from '@zlooks.cn/user-shared';
|
|
3
4
|
import { z } from 'zod';
|
|
5
|
+
import { PASSWORD_AUTH_EXTENSION_ID, PASSWORD_AUTH_METHOD_ID, } from '../service-identity.js';
|
|
4
6
|
export class PasswordAuthenticator {
|
|
5
7
|
repository;
|
|
6
8
|
policy;
|
|
7
9
|
unknownCredentialHash;
|
|
8
10
|
clock;
|
|
9
11
|
attemptCoordinator;
|
|
10
|
-
|
|
12
|
+
lifecycleEvents;
|
|
13
|
+
constructor(repository, policy, unknownCredentialHash, clock, attemptCoordinator, lifecycleEvents) {
|
|
11
14
|
this.repository = repository;
|
|
12
15
|
this.policy = policy;
|
|
13
16
|
this.unknownCredentialHash = unknownCredentialHash;
|
|
14
17
|
this.clock = clock;
|
|
15
18
|
this.attemptCoordinator = attemptCoordinator;
|
|
19
|
+
this.lifecycleEvents = lifecycleEvents;
|
|
16
20
|
}
|
|
17
|
-
static async create(repository, policy, clock = () => new Date(), attemptCoordinator) {
|
|
21
|
+
static async create(repository, policy, clock = () => new Date(), attemptCoordinator, lifecycleEvents) {
|
|
18
22
|
const unknownCredentialHash = await hash(randomBytes(32), argonOptions(policy));
|
|
19
|
-
return new PasswordAuthenticator(repository, policy, unknownCredentialHash, clock, attemptCoordinator);
|
|
23
|
+
return new PasswordAuthenticator(repository, policy, unknownCredentialHash, clock, attemptCoordinator, lifecycleEvents);
|
|
20
24
|
}
|
|
21
25
|
async register(input) {
|
|
22
26
|
const identifier = normalizeEmailIdentifier(input.identifier);
|
|
@@ -98,9 +102,17 @@ export class PasswordAuthenticator {
|
|
|
98
102
|
const operation = async () => {
|
|
99
103
|
const existing = await this.repository.findByIdentifier(identifier);
|
|
100
104
|
if (existing?.registrationTransactionId === input.transactionId) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
105
|
+
if (!await verify(existing.passwordHash, input.password).catch(() => false)) {
|
|
106
|
+
return { ok: false, code: 'registration-rejected' };
|
|
107
|
+
}
|
|
108
|
+
await this.publishLifecycleEvent({
|
|
109
|
+
transactionId: input.transactionId,
|
|
110
|
+
kind: 'registration',
|
|
111
|
+
subject: existing.subject,
|
|
112
|
+
identifier,
|
|
113
|
+
occurredAt: requiredLifecycleTime(existing.emailVerifiedAt, 'registration'),
|
|
114
|
+
});
|
|
115
|
+
return { ok: true, subject: existing.subject, identifier };
|
|
104
116
|
}
|
|
105
117
|
if (existing) {
|
|
106
118
|
return { ok: false, code: 'registration-rejected' };
|
|
@@ -125,6 +137,13 @@ export class PasswordAuthenticator {
|
|
|
125
137
|
const credential = await this.repository.findByIdentifier(identifier);
|
|
126
138
|
if (!credential)
|
|
127
139
|
throw new Error('Created password credential is unavailable');
|
|
140
|
+
await this.publishLifecycleEvent({
|
|
141
|
+
transactionId: input.transactionId,
|
|
142
|
+
kind: 'registration',
|
|
143
|
+
subject: credential.subject,
|
|
144
|
+
identifier,
|
|
145
|
+
occurredAt: now,
|
|
146
|
+
});
|
|
128
147
|
return { ok: true, subject: credential.subject, identifier };
|
|
129
148
|
};
|
|
130
149
|
return this.attemptCoordinator ? this.attemptCoordinator.run(identifier, operation) : operation();
|
|
@@ -147,9 +166,17 @@ export class PasswordAuthenticator {
|
|
|
147
166
|
if (!credential)
|
|
148
167
|
return { ok: false, code: 'invalid-credentials' };
|
|
149
168
|
if (credential.passwordChangedTransactionId === input.transactionId) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
169
|
+
if (!await verify(credential.passwordHash, input.password).catch(() => false)) {
|
|
170
|
+
return { ok: false, code: 'invalid-credentials' };
|
|
171
|
+
}
|
|
172
|
+
await this.publishLifecycleEvent({
|
|
173
|
+
transactionId: input.transactionId,
|
|
174
|
+
kind: 'recovery',
|
|
175
|
+
subject: credential.subject,
|
|
176
|
+
identifier,
|
|
177
|
+
occurredAt: requiredLifecycleTime(credential.passwordChangedAt, 'recovery'),
|
|
178
|
+
});
|
|
179
|
+
return { ok: true, subject: credential.subject, identifier, emailVerified: true };
|
|
153
180
|
}
|
|
154
181
|
const changedAt = this.clock();
|
|
155
182
|
await this.repository.updatePasswordWithLifecycleEvent(identifier, await hash(input.password, argonOptions(this.policy)), changedAt, {
|
|
@@ -159,10 +186,36 @@ export class PasswordAuthenticator {
|
|
|
159
186
|
identifier,
|
|
160
187
|
occurredAt: changedAt,
|
|
161
188
|
});
|
|
189
|
+
await this.publishLifecycleEvent({
|
|
190
|
+
transactionId: input.transactionId,
|
|
191
|
+
kind: 'recovery',
|
|
192
|
+
subject: credential.subject,
|
|
193
|
+
identifier,
|
|
194
|
+
occurredAt: changedAt,
|
|
195
|
+
});
|
|
162
196
|
return { ok: true, subject: credential.subject, identifier, emailVerified: true };
|
|
163
197
|
};
|
|
164
198
|
return this.attemptCoordinator ? this.attemptCoordinator.run(identifier, operation) : operation();
|
|
165
199
|
}
|
|
200
|
+
async publishLifecycleEvent(event) {
|
|
201
|
+
if (!this.lifecycleEvents)
|
|
202
|
+
return;
|
|
203
|
+
await this.lifecycleEvents.publish(createUserCredentialLifecycleDomainEvent({
|
|
204
|
+
protocol: USER_CREDENTIAL_LIFECYCLE_PROTOCOL,
|
|
205
|
+
kind: event.kind,
|
|
206
|
+
authenticationTransactionId: event.transactionId,
|
|
207
|
+
extensionId: PASSWORD_AUTH_EXTENSION_ID,
|
|
208
|
+
methodId: PASSWORD_AUTH_METHOD_ID,
|
|
209
|
+
subject: event.subject,
|
|
210
|
+
email: event.identifier,
|
|
211
|
+
occurredAt: event.occurredAt.toISOString(),
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function requiredLifecycleTime(value, kind) {
|
|
216
|
+
if (!value)
|
|
217
|
+
throw new Error(`Password ${kind} lifecycle time is unavailable`);
|
|
218
|
+
return value;
|
|
166
219
|
}
|
|
167
220
|
function argonOptions(policy) {
|
|
168
221
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-authenticator.js","sourceRoot":"","sources":["../../src/password/password-authenticator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"password-authenticator.js","sourceRoot":"","sources":["../../src/password/password-authenticator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeorm-credential-repository.d.ts","sourceRoot":"","sources":["../../src/password/typeorm-credential-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"typeorm-credential-repository.d.ts","sourceRoot":"","sources":["../../src/password/typeorm-credential-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAElD,OAAO,KAAK,EACV,kBAAkB,EAClB,gCAAgC,EAChC,4BAA4B,EAC7B,MAAM,4BAA4B,CAAC;AAEpC,qBAAa,mCAAoC,YAAW,4BAA4B;IACnE,OAAO,CAAC,QAAQ,CAAC,UAAU;IAA9C,YAAoC,UAAU,EAAE,UAAU,EAAI;IAEjD,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAiBzF;IAEY,MAAM,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBpE;IAEY,wBAAwB,CACnC,UAAU,EAAE,kBAAkB,EAC9B,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,OAAO,CAAC,CAElB;IAEY,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhF;IAEY,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5D;IAEY,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlF;IAEY,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpG;IAEY,gCAAgC,CAC3C,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,IAAI,EACf,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,IAAI,CAAC,CAaf;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IsNull } from 'typeorm';
|
|
2
|
-
import { PasswordCredentialEntity
|
|
2
|
+
import { PasswordCredentialEntity } from '../persistence/entities.js';
|
|
3
3
|
export class TypeOrmPasswordCredentialRepository {
|
|
4
4
|
dataSource;
|
|
5
5
|
constructor(dataSource) {
|
|
@@ -45,28 +45,7 @@ export class TypeOrmPasswordCredentialRepository {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
async createWithLifecycleEvent(credential, event) {
|
|
48
|
-
|
|
49
|
-
await this.dataSource.transaction(async (manager) => {
|
|
50
|
-
await manager.getRepository(PasswordCredentialEntity).insert({
|
|
51
|
-
subject: credential.subject,
|
|
52
|
-
identifier: credential.identifier,
|
|
53
|
-
passwordHash: credential.passwordHash,
|
|
54
|
-
failedAttempts: 0,
|
|
55
|
-
lockedUntil: null,
|
|
56
|
-
emailVerifiedAt: credential.emailVerifiedAt ?? null,
|
|
57
|
-
passwordChangedAt: credential.passwordChangedAt ?? null,
|
|
58
|
-
registrationTransactionId: event.transactionId,
|
|
59
|
-
passwordChangedTransactionId: credential.passwordChangedTransactionId ?? null,
|
|
60
|
-
});
|
|
61
|
-
await manager.getRepository(PasswordCredentialLifecycleOutboxEntity).insert(toOutboxRow(event));
|
|
62
|
-
});
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
if (isUniqueViolation(error))
|
|
67
|
-
return false;
|
|
68
|
-
throw error;
|
|
69
|
-
}
|
|
48
|
+
return this.create({ ...credential, registrationTransactionId: event.transactionId });
|
|
70
49
|
}
|
|
71
50
|
async recordFailure(identifier, lockedUntil) {
|
|
72
51
|
await this.dataSource.transaction(async (manager) => {
|
|
@@ -93,32 +72,18 @@ export class TypeOrmPasswordCredentialRepository {
|
|
|
93
72
|
});
|
|
94
73
|
}
|
|
95
74
|
async updatePasswordWithLifecycleEvent(identifier, passwordHash, changedAt, event) {
|
|
96
|
-
await this.dataSource.
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
passwordChangedTransactionId: event.transactionId,
|
|
104
|
-
});
|
|
105
|
-
if (updated.affected !== 1)
|
|
106
|
-
throw new Error('Password credential is unavailable');
|
|
107
|
-
await manager.getRepository(PasswordCredentialLifecycleOutboxEntity).insert(toOutboxRow(event));
|
|
75
|
+
const updated = await this.dataSource.getRepository(PasswordCredentialEntity).update({ identifier }, {
|
|
76
|
+
passwordHash,
|
|
77
|
+
passwordChangedAt: changedAt,
|
|
78
|
+
emailVerifiedAt: changedAt,
|
|
79
|
+
failedAttempts: 0,
|
|
80
|
+
lockedUntil: null,
|
|
81
|
+
passwordChangedTransactionId: event.transactionId,
|
|
108
82
|
});
|
|
83
|
+
if (updated.affected !== 1)
|
|
84
|
+
throw new Error('Password credential is unavailable');
|
|
109
85
|
}
|
|
110
86
|
}
|
|
111
|
-
function toOutboxRow(event) {
|
|
112
|
-
return {
|
|
113
|
-
transactionId: event.transactionId,
|
|
114
|
-
kind: event.kind,
|
|
115
|
-
subject: event.subject,
|
|
116
|
-
identifier: event.identifier,
|
|
117
|
-
occurredAt: event.occurredAt,
|
|
118
|
-
attempts: 0,
|
|
119
|
-
nextAttemptAt: event.occurredAt,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
87
|
function isUniqueViolation(error) {
|
|
123
88
|
return typeof error === 'object' && error !== null && 'code' in error && error.code === '23505';
|
|
124
89
|
}
|