@crossauth/fastify 0.0.7 → 0.0.9
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/dist/index.cjs +1 -1
- package/dist/index.js +60 -63
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -7,11 +7,11 @@ import be from "@fastify/formbody";
|
|
|
7
7
|
import ye from "@fastify/cors";
|
|
8
8
|
import xe from "@fastify/cookie";
|
|
9
9
|
import ue from "nunjucks";
|
|
10
|
-
import { setParameter as S, ParamType as C, Crypto as A, TokenEmailer as _e, OAuthClientManager as G, SessionManager as Ae, ApiKeyManager as Y, KeyStorage as
|
|
10
|
+
import { setParameter as S, ParamType as C, Crypto as A, TokenEmailer as _e, OAuthClientManager as G, SessionManager as Ae, ApiKeyManager as Y, KeyStorage as Fe, OAuthAuthorizationServer as Ne, DoubleSubmitCsrfToken as Ue, OAuthClientBackend as Oe, OAuthResourceServer as Ie, OAuthTokenConsumer as Me } from "@crossauth/backend";
|
|
11
11
|
import { CrossauthLogger as d, j as c, CrossauthError as l, ErrorCode as g, UserState as U, OAuthFlows as E } from "@crossauth/common";
|
|
12
12
|
import { jwtDecode as W } from "jwt-decode";
|
|
13
13
|
import Re from "qrcode";
|
|
14
|
-
const
|
|
14
|
+
const N = ["Content-Type", "application/json; charset=utf-8"];
|
|
15
15
|
class De {
|
|
16
16
|
/**
|
|
17
17
|
* Constructor.
|
|
@@ -144,7 +144,7 @@ class De {
|
|
|
144
144
|
return await this.updateUser(
|
|
145
145
|
e,
|
|
146
146
|
o,
|
|
147
|
-
(i, n, t) => i.header(...
|
|
147
|
+
(i, n, t) => i.header(...N).send({
|
|
148
148
|
ok: !0,
|
|
149
149
|
emailVerificationRequired: t
|
|
150
150
|
})
|
|
@@ -157,7 +157,7 @@ class De {
|
|
|
157
157
|
errorCodeName: n.codeName,
|
|
158
158
|
errorCode: n.code
|
|
159
159
|
})), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, e, o, (t, a) => {
|
|
160
|
-
t.status(this.sessionServer.errorStatus(i)).header(...
|
|
160
|
+
t.status(this.sessionServer.errorStatus(i)).header(...N).send({
|
|
161
161
|
ok: !1,
|
|
162
162
|
errorMessage: a.message,
|
|
163
163
|
errorMessages: a.messages,
|
|
@@ -280,7 +280,7 @@ class De {
|
|
|
280
280
|
return await this.changeFactor2(
|
|
281
281
|
e,
|
|
282
282
|
o,
|
|
283
|
-
(i, n, t) => i.header(...
|
|
283
|
+
(i, n, t) => i.header(...N).send({
|
|
284
284
|
ok: !0,
|
|
285
285
|
...n.userData
|
|
286
286
|
})
|
|
@@ -292,7 +292,7 @@ class De {
|
|
|
292
292
|
user: (r = e.user) == null ? void 0 : r.username,
|
|
293
293
|
errorCodeName: n.codeName,
|
|
294
294
|
errorCode: n.code
|
|
295
|
-
})), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, e, o, (t, a) => t.status(this.sessionServer.errorStatus(i)).header(...
|
|
295
|
+
})), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, e, o, (t, a) => t.status(this.sessionServer.errorStatus(i)).header(...N).send({
|
|
296
296
|
ok: !1,
|
|
297
297
|
errorMessage: a.message,
|
|
298
298
|
errorMessages: a.messages,
|
|
@@ -397,7 +397,7 @@ class De {
|
|
|
397
397
|
return await this.changePassword(
|
|
398
398
|
e,
|
|
399
399
|
o,
|
|
400
|
-
(i, n) => i.header(...
|
|
400
|
+
(i, n) => i.header(...N).send({
|
|
401
401
|
ok: !0
|
|
402
402
|
})
|
|
403
403
|
);
|
|
@@ -408,7 +408,7 @@ class De {
|
|
|
408
408
|
user: (r = e.user) == null ? void 0 : r.username,
|
|
409
409
|
errorCodeName: n.codeName,
|
|
410
410
|
errorCode: n.code
|
|
411
|
-
})), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, e, o, (t, a) => t.status(this.sessionServer.errorStatus(i)).header(...
|
|
411
|
+
})), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, e, o, (t, a) => t.status(this.sessionServer.errorStatus(i)).header(...N).send({
|
|
412
412
|
ok: !1,
|
|
413
413
|
errorMessage: a.message,
|
|
414
414
|
errorMessages: a.messages,
|
|
@@ -542,7 +542,7 @@ class De {
|
|
|
542
542
|
return await this.reconfigureFactor2(
|
|
543
543
|
o,
|
|
544
544
|
s,
|
|
545
|
-
(i, n, t) => i.header(...
|
|
545
|
+
(i, n, t) => i.header(...N).send({
|
|
546
546
|
ok: !0,
|
|
547
547
|
...n
|
|
548
548
|
})
|
|
@@ -555,7 +555,7 @@ class De {
|
|
|
555
555
|
errorCodeName: n.codeName,
|
|
556
556
|
errorCode: n.code
|
|
557
557
|
})), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, o, s, (t, a) => {
|
|
558
|
-
t.status(this.sessionServer.errorStatus(i)).header(...
|
|
558
|
+
t.status(this.sessionServer.errorStatus(i)).header(...N).send({
|
|
559
559
|
ok: !1,
|
|
560
560
|
errorMessage: a.message,
|
|
561
561
|
errorMessages: a.messages,
|
|
@@ -584,7 +584,7 @@ class De {
|
|
|
584
584
|
ok: !0,
|
|
585
585
|
user: n
|
|
586
586
|
};
|
|
587
|
-
return this.sessionServer.isSessionUser(o) || (t.emailVerificationNeeded = this.enableEmailVerification), i.header(...
|
|
587
|
+
return this.sessionServer.isSessionUser(o) || (t.emailVerificationNeeded = this.enableEmailVerification), i.header(...N).send(t);
|
|
588
588
|
}
|
|
589
589
|
);
|
|
590
590
|
} catch (i) {
|
|
@@ -595,7 +595,7 @@ class De {
|
|
|
595
595
|
errorCodeName: n.codeName,
|
|
596
596
|
errorCode: n.code
|
|
597
597
|
})), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, o, s, (t, a) => {
|
|
598
|
-
t.status(this.sessionServer.errorStatus(i)).header(...
|
|
598
|
+
t.status(this.sessionServer.errorStatus(i)).header(...N).send({
|
|
599
599
|
ok: !1,
|
|
600
600
|
errorMessage: a.message,
|
|
601
601
|
errorMessages: a.messages,
|
|
@@ -686,7 +686,7 @@ class De {
|
|
|
686
686
|
return await this.requestPasswordReset(
|
|
687
687
|
e,
|
|
688
688
|
o,
|
|
689
|
-
(s, r) => s.header(...
|
|
689
|
+
(s, r) => s.header(...N).send({
|
|
690
690
|
ok: !0
|
|
691
691
|
})
|
|
692
692
|
);
|
|
@@ -698,7 +698,7 @@ class De {
|
|
|
698
698
|
errorCodeName: r.codeName,
|
|
699
699
|
errorCode: r.code
|
|
700
700
|
})), d.logger.debug(c({ err: s })), this.sessionServer.handleError(s, e, o, (i, n) => {
|
|
701
|
-
i.status(this.sessionServer.errorStatus(s)).header(...
|
|
701
|
+
i.status(this.sessionServer.errorStatus(s)).header(...N).send({
|
|
702
702
|
ok: !1,
|
|
703
703
|
errorMessage: n.message,
|
|
704
704
|
errorMessages: n.messages,
|
|
@@ -794,7 +794,7 @@ class De {
|
|
|
794
794
|
return await this.resetPassword(
|
|
795
795
|
e,
|
|
796
796
|
o,
|
|
797
|
-
(s, r) => s.header(...
|
|
797
|
+
(s, r) => s.header(...N).send({
|
|
798
798
|
ok: !0
|
|
799
799
|
})
|
|
800
800
|
);
|
|
@@ -806,7 +806,7 @@ class De {
|
|
|
806
806
|
errorCodeName: r.codeName,
|
|
807
807
|
errorCode: r.code
|
|
808
808
|
})), d.logger.debug(c({ err: s })), this.sessionServer.handleError(s, e, o, (i, n) => {
|
|
809
|
-
i.status(this.sessionServer.errorStatus(s)).header(...
|
|
809
|
+
i.status(this.sessionServer.errorStatus(s)).header(...N).send({
|
|
810
810
|
ok: !1,
|
|
811
811
|
errorMessage: n.message,
|
|
812
812
|
errorMessages: n.messages,
|
|
@@ -875,7 +875,7 @@ class De {
|
|
|
875
875
|
return await this.verifyEmail(
|
|
876
876
|
e,
|
|
877
877
|
o,
|
|
878
|
-
(s, r) => s.header(...
|
|
878
|
+
(s, r) => s.header(...N).send({
|
|
879
879
|
ok: !0,
|
|
880
880
|
user: r
|
|
881
881
|
})
|
|
@@ -888,7 +888,7 @@ class De {
|
|
|
888
888
|
errorCodeName: r.codeName,
|
|
889
889
|
errorCode: r.code
|
|
890
890
|
})), d.logger.debug(c({ err: s })), this.sessionServer.handleError(s, e, o, (i, n) => {
|
|
891
|
-
i.status(this.sessionServer.errorStatus(s)).header(...
|
|
891
|
+
i.status(this.sessionServer.errorStatus(s)).header(...N).send({
|
|
892
892
|
ok: !1,
|
|
893
893
|
errorMessage: n.message,
|
|
894
894
|
errorMessages: n.messages,
|
|
@@ -1008,14 +1008,14 @@ class De {
|
|
|
1008
1008
|
ip: e.ip,
|
|
1009
1009
|
user: (s = e.user) == null ? void 0 : s.username
|
|
1010
1010
|
})), !e.user)
|
|
1011
|
-
return o.status(401).header(...
|
|
1011
|
+
return o.status(401).header(...N).send({ ok: !1 });
|
|
1012
1012
|
try {
|
|
1013
1013
|
return await this.deleteUser(
|
|
1014
1014
|
e,
|
|
1015
1015
|
o,
|
|
1016
1016
|
(i) => {
|
|
1017
1017
|
var n;
|
|
1018
|
-
return i.header(...
|
|
1018
|
+
return i.header(...N).send({
|
|
1019
1019
|
ok: !0,
|
|
1020
1020
|
userid: (n = e.user) == null ? void 0 : n.id
|
|
1021
1021
|
});
|
|
@@ -1029,7 +1029,7 @@ class De {
|
|
|
1029
1029
|
errorCodeName: n.codeName,
|
|
1030
1030
|
errorCode: n.code
|
|
1031
1031
|
})), d.logger.debug(c({ err: i })), this.sessionServer.handleError(i, e, o, (t, a) => {
|
|
1032
|
-
t.status(this.sessionServer.errorStatus(i)).header(...
|
|
1032
|
+
t.status(this.sessionServer.errorStatus(i)).header(...N).send({
|
|
1033
1033
|
ok: !1,
|
|
1034
1034
|
errorMessage: a.message,
|
|
1035
1035
|
errorMessages: a.messages,
|
|
@@ -1061,7 +1061,7 @@ class De {
|
|
|
1061
1061
|
if (i.length > 0)
|
|
1062
1062
|
throw new l(g.FormEntry, i);
|
|
1063
1063
|
let n = await this.sessionServer.sessionManager.updateUser(e.user, r);
|
|
1064
|
-
return s(o, e.user, n);
|
|
1064
|
+
return s(o, e.user, n.emailVerificationTokenSent);
|
|
1065
1065
|
}
|
|
1066
1066
|
async changeFactor2(e, o, s) {
|
|
1067
1067
|
if (!this.sessionServer.userStorage) throw new l(g.Configuration, "Cannot call changeFactor2 unless a user storage is provided");
|
|
@@ -1509,11 +1509,11 @@ class He {
|
|
|
1509
1509
|
s,
|
|
1510
1510
|
e,
|
|
1511
1511
|
o,
|
|
1512
|
-
(n, t, a) => {
|
|
1513
|
-
|
|
1514
|
-
return n.view(this.adminUpdateUserPage, {
|
|
1512
|
+
(n, t, a, h) => {
|
|
1513
|
+
let f = "User's details have been updated.";
|
|
1514
|
+
return a ? f = "User's details have been updated and sent and an email verification link." : h && (f = "User's details have been updated and sent and a password reset token sent."), n.view(this.adminUpdateUserPage, {
|
|
1515
1515
|
csrfToken: e.csrfToken,
|
|
1516
|
-
message:
|
|
1516
|
+
message: f,
|
|
1517
1517
|
urlPrefix: this.adminPrefix,
|
|
1518
1518
|
allowedFactor2: this.sessionServer.allowedFactor2Details()
|
|
1519
1519
|
});
|
|
@@ -1957,7 +1957,7 @@ class He {
|
|
|
1957
1957
|
//await this.sessionServer.sessionManager.updateUser(request.user, user,);
|
|
1958
1958
|
await this.sessionServer.sessionManager.updateUser(e, e, !0)
|
|
1959
1959
|
);
|
|
1960
|
-
return r(s, o.user, h);
|
|
1960
|
+
return r(s, o.user, h.emailVerificationTokenSent, h.passwordResetTokenSent);
|
|
1961
1961
|
}
|
|
1962
1962
|
async changePassword(e, o, s, r) {
|
|
1963
1963
|
if (!this.sessionServer.userStorage) throw new l(g.Configuration, "Cannot call updateUser unless a user storage is provided");
|
|
@@ -3568,22 +3568,22 @@ class Ke {
|
|
|
3568
3568
|
let M = {};
|
|
3569
3569
|
for (let I in t.body)
|
|
3570
3570
|
T.includes(I) && (M[I] = t.body[I]);
|
|
3571
|
-
let
|
|
3571
|
+
let F;
|
|
3572
3572
|
try {
|
|
3573
3573
|
await this.sessionManager.completeTwoFactorPageVisit(M, w);
|
|
3574
3574
|
} catch (I) {
|
|
3575
|
-
|
|
3575
|
+
F = l.asCrossauthError(I), d.logger.debug(c({ err: I }));
|
|
3576
3576
|
const O = l.asCrossauthError(I);
|
|
3577
3577
|
d.logger.error(c({
|
|
3578
|
-
msg:
|
|
3578
|
+
msg: F.message,
|
|
3579
3579
|
cerr: I,
|
|
3580
3580
|
user: t.body.username,
|
|
3581
3581
|
errorCode: O.code,
|
|
3582
3582
|
errorCodeName: O.codeName
|
|
3583
3583
|
}));
|
|
3584
3584
|
}
|
|
3585
|
-
if (t.body = m.pre2fa.body,
|
|
3586
|
-
if (
|
|
3585
|
+
if (t.body = m.pre2fa.body, F)
|
|
3586
|
+
if (F.code == g.Expired) {
|
|
3587
3587
|
d.logger.debug("Error - cancelling 2FA");
|
|
3588
3588
|
try {
|
|
3589
3589
|
await this.sessionManager.cancelTwoFactorPageVisit(w);
|
|
@@ -3592,18 +3592,18 @@ class Ke {
|
|
|
3592
3592
|
}
|
|
3593
3593
|
t.body = {
|
|
3594
3594
|
...t.body,
|
|
3595
|
-
errorMessage:
|
|
3596
|
-
errorMessages:
|
|
3597
|
-
errorCode: "" +
|
|
3598
|
-
errorCodeName: g[
|
|
3595
|
+
errorMessage: F.message,
|
|
3596
|
+
errorMessages: F.message,
|
|
3597
|
+
errorCode: "" + F.code,
|
|
3598
|
+
errorCodeName: g[F.code]
|
|
3599
3599
|
};
|
|
3600
3600
|
} else
|
|
3601
|
-
return this.factor2ProtectedPageEndpoints.includes(t.url) ? a.redirect(this.prefix + "factor2?error=" + g[
|
|
3601
|
+
return this.factor2ProtectedPageEndpoints.includes(t.url) ? a.redirect(this.prefix + "factor2?error=" + g[F.code]) : a.status(F.httpStatus).send(JSON.stringify({
|
|
3602
3602
|
ok: !1,
|
|
3603
|
-
errorMessage:
|
|
3604
|
-
errorMessages:
|
|
3605
|
-
errorCode:
|
|
3606
|
-
errorCodeName: g[
|
|
3603
|
+
errorMessage: F.message,
|
|
3604
|
+
errorMessages: F.messages,
|
|
3605
|
+
errorCode: F.code,
|
|
3606
|
+
errorCodeName: g[F.code]
|
|
3607
3607
|
}));
|
|
3608
3608
|
} else
|
|
3609
3609
|
return this.validateCsrfToken(t), d.logger.debug("Starting 2FA"), this.sessionManager.initiateTwoFactorPageVisit(t.user, w, t.body, t.url.replace(/\?.*$/, "")), this.factor2ProtectedPageEndpoints.includes(t.url) ? a.redirect(this.prefix + "factor2") : a.send(JSON.stringify({
|
|
@@ -3692,22 +3692,19 @@ class Ke {
|
|
|
3692
3692
|
}));
|
|
3693
3693
|
}
|
|
3694
3694
|
} else if (i.state == U.passwordResetNeeded || i.state == U.passwordAndFactor2ResetNeeded) {
|
|
3695
|
-
|
|
3696
|
-
|
|
3697
|
-
{
|
|
3698
|
-
|
|
3699
|
-
|
|
3700
|
-
|
|
3701
|
-
|
|
3702
|
-
|
|
3703
|
-
|
|
3704
|
-
|
|
3705
|
-
|
|
3706
|
-
|
|
3707
|
-
|
|
3708
|
-
urlPrefix: this.prefix
|
|
3709
|
-
}));
|
|
3710
|
-
}
|
|
3695
|
+
d.logger.debug(c({ msg: "Password reset needed - sending error" }));
|
|
3696
|
+
const n = new l(g.PasswordResetNeeded);
|
|
3697
|
+
return this.handleError(n, e, r, (t, a) => t.view(this.loginPage, {
|
|
3698
|
+
errorMessage: a.message,
|
|
3699
|
+
errorMessages: a.messages,
|
|
3700
|
+
errorCode: a.code,
|
|
3701
|
+
errorCodeName: g[a.code],
|
|
3702
|
+
next: s,
|
|
3703
|
+
persist: e.body.persist,
|
|
3704
|
+
username: e.body.username,
|
|
3705
|
+
csrfToken: e.csrfToken,
|
|
3706
|
+
urlPrefix: this.prefix
|
|
3707
|
+
}));
|
|
3711
3708
|
} else if (this.allowedFactor2.length > 0 && (i.state == U.factor2ResetNeeded || !this.allowedFactor2.includes(i.factor2 ? i.factor2 : "none"))) {
|
|
3712
3709
|
if (d.logger.debug(c({
|
|
3713
3710
|
msg: `Factor2 reset needed. Factor2 is ${i.factor2}, state is ${i.state}, allowed factor2 is [${this.allowedFactor2.join(", ")}]`,
|
|
@@ -4752,7 +4749,7 @@ class Ye {
|
|
|
4752
4749
|
msg: "Valid API key",
|
|
4753
4750
|
hahedApiKey: Y.hashSignedApiKeyValue(t.value)
|
|
4754
4751
|
}));
|
|
4755
|
-
const a =
|
|
4752
|
+
const a = Fe.decodeData(t.data);
|
|
4756
4753
|
if (i.apiKey = { ...t, ...a }, "scope" in a && Array.isArray(a.scope)) {
|
|
4757
4754
|
let h = [];
|
|
4758
4755
|
for (let f of a.scope)
|
|
@@ -4807,7 +4804,7 @@ class $e {
|
|
|
4807
4804
|
p(this, "refreshTokenCookieSameSite", "strict");
|
|
4808
4805
|
p(this, "csrfTokens");
|
|
4809
4806
|
p(this, "createGetCsrfTokenEndpoint", !1);
|
|
4810
|
-
this.app = e, this.fastifyServer = o, this.clientStorage = s, this.authServer = new
|
|
4807
|
+
this.app = e, this.fastifyServer = o, this.clientStorage = s, this.authServer = new Ne(
|
|
4811
4808
|
this.clientStorage,
|
|
4812
4809
|
r,
|
|
4813
4810
|
i,
|
|
@@ -4906,8 +4903,8 @@ class $e {
|
|
|
4906
4903
|
let m, P;
|
|
4907
4904
|
const T = t.headers.authorization.split(" ");
|
|
4908
4905
|
if (T.length == 2 && T[0].toLocaleLowerCase() == "basic") {
|
|
4909
|
-
const
|
|
4910
|
-
|
|
4906
|
+
const F = A.base64Decode(T[1]).split(":", 2);
|
|
4907
|
+
F.length == 2 && (m = F[0], P = F[1]);
|
|
4911
4908
|
}
|
|
4912
4909
|
m == null || P == null ? d.logger.warn(c({
|
|
4913
4910
|
msg: "Ignoring malform authenization header " + t.headers.authorization
|
|
@@ -6372,13 +6369,13 @@ class we extends Oe {
|
|
|
6372
6369
|
method: f[w],
|
|
6373
6370
|
url: this.prefix + this.bffEndpointName + h,
|
|
6374
6371
|
handler: async (m, P) => {
|
|
6375
|
-
var
|
|
6372
|
+
var F, I;
|
|
6376
6373
|
d.logger.info(c({
|
|
6377
6374
|
msg: "Page visit",
|
|
6378
6375
|
method: m.method,
|
|
6379
6376
|
url: m.url,
|
|
6380
6377
|
ip: m.ip,
|
|
6381
|
-
user: (
|
|
6378
|
+
user: (F = m.user) == null ? void 0 : F.username
|
|
6382
6379
|
}));
|
|
6383
6380
|
const T = m.url.substring(this.prefix.length + this.bffEndpointName.length);
|
|
6384
6381
|
d.logger.debug(c({ msg: "Resource server URL " + T }));
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crossauth/fastify",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.9",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.cjs",
|
|
@@ -59,8 +59,8 @@
|
|
|
59
59
|
"prisma": "^5.9.1",
|
|
60
60
|
"qrcode": "^1.5.3",
|
|
61
61
|
"sonic-boom": "^3.7.0",
|
|
62
|
-
"@crossauth/backend": "^0.0.
|
|
63
|
-
"@crossauth/common": "^0.0.
|
|
62
|
+
"@crossauth/backend": "^0.0.9",
|
|
63
|
+
"@crossauth/common": "^0.0.9"
|
|
64
64
|
},
|
|
65
65
|
"scripts": {
|
|
66
66
|
"dev": "vite",
|