@flowerforce/flowerbase 1.2.1-beta.2 → 1.2.1-beta.4
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/auth/providers/local-userpass/controller.d.ts.map +1 -1
- package/dist/auth/providers/local-userpass/controller.js +52 -36
- package/dist/auth/providers/local-userpass/dtos.d.ts +7 -1
- package/dist/auth/providers/local-userpass/dtos.d.ts.map +1 -1
- package/dist/auth/utils.d.ts +28 -2
- package/dist/auth/utils.d.ts.map +1 -1
- package/dist/auth/utils.js +16 -4
- package/dist/utils/crypto/index.js +1 -1
- package/package.json +1 -1
- package/src/auth/providers/local-userpass/controller.ts +80 -52
- package/src/auth/providers/local-userpass/dtos.ts +8 -1
- package/src/auth/utils.ts +17 -3
- package/src/utils/crypto/index.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/local-userpass/controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/local-userpass/controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAyBzC;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,eAAe,iBA+PjE"}
|
|
@@ -32,6 +32,48 @@ function localUserPassController(app) {
|
|
|
32
32
|
const functionsList = state_1.StateManager.select('functions');
|
|
33
33
|
const { authCollection, userCollection, user_id_field, on_user_creation_function_name } = constants_1.AUTH_CONFIG;
|
|
34
34
|
const db = app.mongo.client.db(constants_1.DB_NAME);
|
|
35
|
+
const handleResetPasswordRequest = (email, password, extraArguments) => __awaiter(this, void 0, void 0, function* () {
|
|
36
|
+
const { resetPasswordCollection, resetPasswordConfig } = constants_1.AUTH_CONFIG;
|
|
37
|
+
const authUser = yield db.collection(authCollection).findOne({
|
|
38
|
+
email
|
|
39
|
+
});
|
|
40
|
+
if (!authUser) {
|
|
41
|
+
throw new Error(utils_1.AUTH_ERRORS.INVALID_CREDENTIALS);
|
|
42
|
+
}
|
|
43
|
+
const token = (0, crypto_1.generateToken)();
|
|
44
|
+
const tokenId = (0, crypto_1.generateToken)();
|
|
45
|
+
yield (db === null || db === void 0 ? void 0 : db.collection(resetPasswordCollection).updateOne({ email }, { $set: { token, tokenId, email, createdAt: new Date() } }, { upsert: true }));
|
|
46
|
+
if (resetPasswordConfig.runResetFunction && resetPasswordConfig.resetFunctionName) {
|
|
47
|
+
const functionsList = state_1.StateManager.select('functions');
|
|
48
|
+
const services = state_1.StateManager.select('services');
|
|
49
|
+
const currentFunction = functionsList[resetPasswordConfig.resetFunctionName];
|
|
50
|
+
const baseArgs = { token, tokenId, email, password };
|
|
51
|
+
const args = Array.isArray(extraArguments) ? [baseArgs, ...extraArguments] : [baseArgs];
|
|
52
|
+
yield (0, context_1.GenerateContext)({
|
|
53
|
+
args,
|
|
54
|
+
app,
|
|
55
|
+
rules: {},
|
|
56
|
+
user: {},
|
|
57
|
+
currentFunction,
|
|
58
|
+
functionsList,
|
|
59
|
+
services
|
|
60
|
+
});
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const { from, subject, mailToken, body } = (0, utils_1.getMailConfig)(resetPasswordConfig, token, tokenId);
|
|
65
|
+
mail_1.default.setApiKey(mailToken);
|
|
66
|
+
yield mail_1.default.send({
|
|
67
|
+
to: email,
|
|
68
|
+
from,
|
|
69
|
+
subject,
|
|
70
|
+
html: body
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.log("Error send mail reset:", error);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
35
77
|
/**
|
|
36
78
|
* Endpoint for user registration.
|
|
37
79
|
*
|
|
@@ -121,48 +163,22 @@ function localUserPassController(app) {
|
|
|
121
163
|
/**
|
|
122
164
|
* Endpoint for reset password.
|
|
123
165
|
*
|
|
124
|
-
* @route {POST} /reset/
|
|
166
|
+
* @route {POST} /reset/send
|
|
125
167
|
* @param {ResetPasswordDto} req - The request object with th reset request.
|
|
126
168
|
* @returns {Promise<void>}
|
|
127
169
|
*/
|
|
128
170
|
app.post(utils_1.AUTH_ENDPOINTS.RESET, {
|
|
129
|
-
schema: utils_1.
|
|
171
|
+
schema: utils_1.RESET_SEND_SCHEMA
|
|
130
172
|
}, function (req) {
|
|
131
173
|
return __awaiter(this, void 0, void 0, function* () {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const token = (0, crypto_1.generateToken)();
|
|
141
|
-
const tokenId = (0, crypto_1.generateToken)();
|
|
142
|
-
yield (db === null || db === void 0 ? void 0 : db.collection(resetPasswordCollection).updateOne({ email }, { $set: { token, tokenId, email, createdAt: new Date() } }, { upsert: true }));
|
|
143
|
-
if (resetPasswordConfig.runResetFunction && resetPasswordConfig.resetFunctionName) {
|
|
144
|
-
const functionsList = state_1.StateManager.select('functions');
|
|
145
|
-
const services = state_1.StateManager.select('services');
|
|
146
|
-
const currentFunction = functionsList[resetPasswordConfig.resetFunctionName];
|
|
147
|
-
yield (0, context_1.GenerateContext)({
|
|
148
|
-
args: [{ token, tokenId, email }],
|
|
149
|
-
app,
|
|
150
|
-
rules: {},
|
|
151
|
-
user: {},
|
|
152
|
-
currentFunction,
|
|
153
|
-
functionsList,
|
|
154
|
-
services
|
|
155
|
-
});
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
const { from, subject, mailToken, body } = (0, utils_1.getMailConfig)(resetPasswordConfig, token, tokenId);
|
|
159
|
-
mail_1.default.setApiKey(mailToken);
|
|
160
|
-
yield mail_1.default.send({
|
|
161
|
-
to: email,
|
|
162
|
-
from,
|
|
163
|
-
subject,
|
|
164
|
-
html: body
|
|
165
|
-
});
|
|
174
|
+
yield handleResetPasswordRequest(req.body.email);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
app.post(utils_1.AUTH_ENDPOINTS.RESET_CALL, {
|
|
178
|
+
schema: utils_1.RESET_CALL_SCHEMA
|
|
179
|
+
}, function (req) {
|
|
180
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
181
|
+
yield handleResetPasswordRequest(req.body.email, req.body.password, req.body.arguments);
|
|
166
182
|
});
|
|
167
183
|
});
|
|
168
184
|
/**
|
|
@@ -19,10 +19,16 @@ export interface LoginDto {
|
|
|
19
19
|
Body: LoginUserDto;
|
|
20
20
|
Reply: LoginSuccessDto;
|
|
21
21
|
}
|
|
22
|
-
export interface
|
|
22
|
+
export interface ResetPasswordSendDto {
|
|
23
|
+
Body: {
|
|
24
|
+
email: string;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export interface ResetPasswordCallDto {
|
|
23
28
|
Body: {
|
|
24
29
|
email: string;
|
|
25
30
|
password: string;
|
|
31
|
+
arguments?: unknown[];
|
|
26
32
|
};
|
|
27
33
|
}
|
|
28
34
|
export interface ConfirmResetPasswordDto {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dtos.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/local-userpass/dtos.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,eAAe,CAAA;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAA;IAClB,KAAK,EAAE,eAAe,CAAA;CACvB;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"dtos.d.ts","sourceRoot":"","sources":["../../../../src/auth/providers/local-userpass/dtos.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,eAAe,CAAA;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAA;IAClB,KAAK,EAAE,eAAe,CAAA;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAA;KACtB,CAAA;CACF;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF"}
|
package/dist/auth/utils.d.ts
CHANGED
|
@@ -12,7 +12,18 @@ export declare const LOGIN_SCHEMA: {
|
|
|
12
12
|
required: string[];
|
|
13
13
|
};
|
|
14
14
|
};
|
|
15
|
-
export declare const
|
|
15
|
+
export declare const RESET_SEND_SCHEMA: {
|
|
16
|
+
body: {
|
|
17
|
+
type: string;
|
|
18
|
+
properties: {
|
|
19
|
+
email: {
|
|
20
|
+
type: string;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
required: string[];
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export declare const RESET_CALL_SCHEMA: {
|
|
16
27
|
body: {
|
|
17
28
|
type: string;
|
|
18
29
|
properties: {
|
|
@@ -22,6 +33,9 @@ export declare const RESET_SCHEMA: {
|
|
|
22
33
|
password: {
|
|
23
34
|
type: string;
|
|
24
35
|
};
|
|
36
|
+
arguments: {
|
|
37
|
+
type: string;
|
|
38
|
+
};
|
|
25
39
|
};
|
|
26
40
|
required: string[];
|
|
27
41
|
};
|
|
@@ -43,6 +57,17 @@ export declare const CONFIRM_RESET_SCHEMA: {
|
|
|
43
57
|
required: string[];
|
|
44
58
|
};
|
|
45
59
|
};
|
|
60
|
+
export declare const RESET_SCHEMA: {
|
|
61
|
+
body: {
|
|
62
|
+
type: string;
|
|
63
|
+
properties: {
|
|
64
|
+
email: {
|
|
65
|
+
type: string;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
required: string[];
|
|
69
|
+
};
|
|
70
|
+
};
|
|
46
71
|
export declare const REGISTRATION_SCHEMA: {
|
|
47
72
|
body: {
|
|
48
73
|
type: string;
|
|
@@ -62,7 +87,8 @@ export declare enum AUTH_ENDPOINTS {
|
|
|
62
87
|
REGISTRATION = "/register",
|
|
63
88
|
PROFILE = "/profile",
|
|
64
89
|
SESSION = "/session",
|
|
65
|
-
RESET = "/reset/
|
|
90
|
+
RESET = "/reset/send",
|
|
91
|
+
RESET_CALL = "/reset/call",
|
|
66
92
|
CONFIRM_RESET = "/reset",
|
|
67
93
|
FIRST_USER = "/setup/first-user"
|
|
68
94
|
}
|
package/dist/auth/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/auth/utils.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY;;;;;;;;;;;;;CASxB,CAAA;AAED,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/auth/utils.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY;;;;;;;;;;;;;CASxB,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;CAQ7B,CAAA;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAU7B,CAAA;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;CAUhC,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;;;CAAoB,CAAA;AAE7C,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;CAS/B,CAAA;AAED,oBAAY,cAAc;IACxB,KAAK,WAAW;IAChB,YAAY,cAAc;IAC1B,OAAO,aAAa;IACpB,OAAO,aAAa;IACpB,KAAK,gBAAgB;IACrB,UAAU,gBAAgB;IAC1B,aAAa,WAAW;IACxB,UAAU,sBAAsB;CACjC;AAED,oBAAY,WAAW;IACrB,mBAAmB,wBAAwB;IAC3C,aAAa,mCAAmC;IAChD,oBAAoB,sCAAsC;CAC3D;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,aAAa,CAAA;IAC/B,iBAAiB,EAAE,cAAc,CAAA;CAClC;AAED,UAAU,MAAM;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;CAClB;AACD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE;QACN,kBAAkB,EAAE,MAAM,CAAA;KAC3B,CAAA;CACF;AAED,MAAM,WAAW,MAAM;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,uBAAuB,EAAE,OAAO,CAAA;IAChC,gBAAgB,EAAE,OAAO,CAAA;IACzB,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,8BAA8B,EAAE,MAAM,CAAA;CACvC;AAMD;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAO,UAGjC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAO,oBAGrC,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,qBAAqB,MAAM,EAC3B,OAAO,MAAM,EACb,SAAS,MAAM;;;;;CA2DhB,CAAA;AAMD,eAAO,MAAM,gBAAgB,GAAI,eAAW,WAG3C,CAAA"}
|
package/dist/auth/utils.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.generatePassword = exports.getMailConfig = exports.loadCustomUserData = exports.loadAuthConfig = exports.AUTH_ERRORS = exports.AUTH_ENDPOINTS = exports.REGISTRATION_SCHEMA = exports.CONFIRM_RESET_SCHEMA = exports.
|
|
6
|
+
exports.generatePassword = exports.getMailConfig = exports.loadCustomUserData = exports.loadAuthConfig = exports.AUTH_ERRORS = exports.AUTH_ENDPOINTS = exports.REGISTRATION_SCHEMA = exports.RESET_SCHEMA = exports.CONFIRM_RESET_SCHEMA = exports.RESET_CALL_SCHEMA = exports.RESET_SEND_SCHEMA = exports.LOGIN_SCHEMA = void 0;
|
|
7
7
|
const crypto_1 = __importDefault(require("crypto"));
|
|
8
8
|
const fs_1 = __importDefault(require("fs"));
|
|
9
9
|
const path_1 = __importDefault(require("path"));
|
|
@@ -18,12 +18,22 @@ exports.LOGIN_SCHEMA = {
|
|
|
18
18
|
required: ['username', 'password']
|
|
19
19
|
}
|
|
20
20
|
};
|
|
21
|
-
exports.
|
|
21
|
+
exports.RESET_SEND_SCHEMA = {
|
|
22
|
+
body: {
|
|
23
|
+
type: 'object',
|
|
24
|
+
properties: {
|
|
25
|
+
email: { type: 'string' }
|
|
26
|
+
},
|
|
27
|
+
required: ['email']
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
exports.RESET_CALL_SCHEMA = {
|
|
22
31
|
body: {
|
|
23
32
|
type: 'object',
|
|
24
33
|
properties: {
|
|
25
34
|
email: { type: 'string' },
|
|
26
|
-
password: { type: 'string' }
|
|
35
|
+
password: { type: 'string' },
|
|
36
|
+
arguments: { type: 'array' }
|
|
27
37
|
},
|
|
28
38
|
required: ['email', 'password']
|
|
29
39
|
}
|
|
@@ -39,6 +49,7 @@ exports.CONFIRM_RESET_SCHEMA = {
|
|
|
39
49
|
required: ['password', 'token', 'tokenId']
|
|
40
50
|
}
|
|
41
51
|
};
|
|
52
|
+
exports.RESET_SCHEMA = exports.RESET_SEND_SCHEMA;
|
|
42
53
|
exports.REGISTRATION_SCHEMA = {
|
|
43
54
|
body: {
|
|
44
55
|
type: 'object',
|
|
@@ -55,7 +66,8 @@ var AUTH_ENDPOINTS;
|
|
|
55
66
|
AUTH_ENDPOINTS["REGISTRATION"] = "/register";
|
|
56
67
|
AUTH_ENDPOINTS["PROFILE"] = "/profile";
|
|
57
68
|
AUTH_ENDPOINTS["SESSION"] = "/session";
|
|
58
|
-
AUTH_ENDPOINTS["RESET"] = "/reset/
|
|
69
|
+
AUTH_ENDPOINTS["RESET"] = "/reset/send";
|
|
70
|
+
AUTH_ENDPOINTS["RESET_CALL"] = "/reset/call";
|
|
59
71
|
AUTH_ENDPOINTS["CONFIRM_RESET"] = "/reset";
|
|
60
72
|
AUTH_ENDPOINTS["FIRST_USER"] = "/setup/first-user";
|
|
61
73
|
})(AUTH_ENDPOINTS || (exports.AUTH_ENDPOINTS = AUTH_ENDPOINTS = {}));
|
|
@@ -47,7 +47,7 @@ exports.comparePassword = comparePassword;
|
|
|
47
47
|
* > Generate a random token
|
|
48
48
|
* @param length -> the token length
|
|
49
49
|
*/
|
|
50
|
-
const generateToken = (length =
|
|
50
|
+
const generateToken = (length = 64) => {
|
|
51
51
|
return node_crypto_1.default.randomBytes(length).toString('hex');
|
|
52
52
|
};
|
|
53
53
|
exports.generateToken = generateToken;
|
package/package.json
CHANGED
|
@@ -14,13 +14,15 @@ import {
|
|
|
14
14
|
getMailConfig,
|
|
15
15
|
LOGIN_SCHEMA,
|
|
16
16
|
REGISTRATION_SCHEMA,
|
|
17
|
-
|
|
17
|
+
RESET_CALL_SCHEMA,
|
|
18
|
+
RESET_SEND_SCHEMA
|
|
18
19
|
} from '../../utils'
|
|
19
20
|
import {
|
|
20
21
|
ConfirmResetPasswordDto,
|
|
21
22
|
LoginDto,
|
|
22
23
|
RegistrationDto,
|
|
23
|
-
|
|
24
|
+
ResetPasswordCallDto,
|
|
25
|
+
ResetPasswordSendDto
|
|
24
26
|
} from './dtos'
|
|
25
27
|
/**
|
|
26
28
|
* Controller for handling local user registration and login.
|
|
@@ -37,6 +39,66 @@ export async function localUserPassController(app: FastifyInstance) {
|
|
|
37
39
|
on_user_creation_function_name
|
|
38
40
|
} = AUTH_CONFIG
|
|
39
41
|
const db = app.mongo.client.db(DB_NAME)
|
|
42
|
+
const handleResetPasswordRequest = async (
|
|
43
|
+
email: string,
|
|
44
|
+
password?: string,
|
|
45
|
+
extraArguments?: unknown[]
|
|
46
|
+
) => {
|
|
47
|
+
const { resetPasswordCollection, resetPasswordConfig } = AUTH_CONFIG
|
|
48
|
+
const authUser = await db.collection(authCollection!).findOne({
|
|
49
|
+
email
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
if (!authUser) {
|
|
53
|
+
throw new Error(AUTH_ERRORS.INVALID_CREDENTIALS)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const token = generateToken()
|
|
57
|
+
const tokenId = generateToken()
|
|
58
|
+
|
|
59
|
+
await db
|
|
60
|
+
?.collection(resetPasswordCollection)
|
|
61
|
+
.updateOne(
|
|
62
|
+
{ email },
|
|
63
|
+
{ $set: { token, tokenId, email, createdAt: new Date() } },
|
|
64
|
+
{ upsert: true }
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
if (resetPasswordConfig.runResetFunction && resetPasswordConfig.resetFunctionName) {
|
|
68
|
+
const functionsList = StateManager.select('functions')
|
|
69
|
+
const services = StateManager.select('services')
|
|
70
|
+
const currentFunction = functionsList[resetPasswordConfig.resetFunctionName]
|
|
71
|
+
const baseArgs = { token, tokenId, email, password }
|
|
72
|
+
const args = Array.isArray(extraArguments) ? [baseArgs, ...extraArguments] : [baseArgs]
|
|
73
|
+
await GenerateContext({
|
|
74
|
+
args,
|
|
75
|
+
app,
|
|
76
|
+
rules: {},
|
|
77
|
+
user: {},
|
|
78
|
+
currentFunction,
|
|
79
|
+
functionsList,
|
|
80
|
+
services
|
|
81
|
+
})
|
|
82
|
+
return
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
const { from, subject, mailToken, body } = getMailConfig(
|
|
87
|
+
resetPasswordConfig,
|
|
88
|
+
token,
|
|
89
|
+
tokenId
|
|
90
|
+
)
|
|
91
|
+
sendGrid.setApiKey(mailToken)
|
|
92
|
+
await sendGrid.send({
|
|
93
|
+
to: email,
|
|
94
|
+
from,
|
|
95
|
+
subject,
|
|
96
|
+
html: body
|
|
97
|
+
})
|
|
98
|
+
} catch (error) {
|
|
99
|
+
console.log("Error send mail reset:", error)
|
|
100
|
+
}
|
|
101
|
+
}
|
|
40
102
|
|
|
41
103
|
/**
|
|
42
104
|
* Endpoint for user registration.
|
|
@@ -158,65 +220,31 @@ export async function localUserPassController(app: FastifyInstance) {
|
|
|
158
220
|
/**
|
|
159
221
|
* Endpoint for reset password.
|
|
160
222
|
*
|
|
161
|
-
* @route {POST} /reset/
|
|
223
|
+
* @route {POST} /reset/send
|
|
162
224
|
* @param {ResetPasswordDto} req - The request object with th reset request.
|
|
163
225
|
* @returns {Promise<void>}
|
|
164
226
|
*/
|
|
165
|
-
app.post<
|
|
227
|
+
app.post<ResetPasswordSendDto>(
|
|
166
228
|
AUTH_ENDPOINTS.RESET,
|
|
167
229
|
{
|
|
168
|
-
schema:
|
|
230
|
+
schema: RESET_SEND_SCHEMA
|
|
169
231
|
},
|
|
170
232
|
async function (req) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
email
|
|
175
|
-
})
|
|
176
|
-
|
|
177
|
-
if (!authUser) {
|
|
178
|
-
throw new Error(AUTH_ERRORS.INVALID_CREDENTIALS)
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const token = generateToken()
|
|
182
|
-
const tokenId = generateToken()
|
|
183
|
-
|
|
184
|
-
await db
|
|
185
|
-
?.collection(resetPasswordCollection)
|
|
186
|
-
.updateOne(
|
|
187
|
-
{ email },
|
|
188
|
-
{ $set: { token, tokenId, email, createdAt: new Date() } },
|
|
189
|
-
{ upsert: true }
|
|
190
|
-
)
|
|
191
|
-
|
|
192
|
-
if (resetPasswordConfig.runResetFunction && resetPasswordConfig.resetFunctionName) {
|
|
193
|
-
const functionsList = StateManager.select('functions')
|
|
194
|
-
const services = StateManager.select('services')
|
|
195
|
-
const currentFunction = functionsList[resetPasswordConfig.resetFunctionName]
|
|
196
|
-
await GenerateContext({
|
|
197
|
-
args: [{ token, tokenId, email }],
|
|
198
|
-
app,
|
|
199
|
-
rules: {},
|
|
200
|
-
user: {},
|
|
201
|
-
currentFunction,
|
|
202
|
-
functionsList,
|
|
203
|
-
services
|
|
204
|
-
})
|
|
205
|
-
return
|
|
206
|
-
}
|
|
233
|
+
await handleResetPasswordRequest(req.body.email)
|
|
234
|
+
}
|
|
235
|
+
)
|
|
207
236
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
237
|
+
app.post<ResetPasswordCallDto>(
|
|
238
|
+
AUTH_ENDPOINTS.RESET_CALL,
|
|
239
|
+
{
|
|
240
|
+
schema: RESET_CALL_SCHEMA
|
|
241
|
+
},
|
|
242
|
+
async function (req) {
|
|
243
|
+
await handleResetPasswordRequest(
|
|
244
|
+
req.body.email,
|
|
245
|
+
req.body.password,
|
|
246
|
+
req.body.arguments
|
|
212
247
|
)
|
|
213
|
-
sendGrid.setApiKey(mailToken)
|
|
214
|
-
await sendGrid.send({
|
|
215
|
-
to: email,
|
|
216
|
-
from,
|
|
217
|
-
subject,
|
|
218
|
-
html: body
|
|
219
|
-
})
|
|
220
248
|
}
|
|
221
249
|
)
|
|
222
250
|
|
|
@@ -24,10 +24,17 @@ export interface LoginDto {
|
|
|
24
24
|
Reply: LoginSuccessDto
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
export interface
|
|
27
|
+
export interface ResetPasswordSendDto {
|
|
28
|
+
Body: {
|
|
29
|
+
email: string
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ResetPasswordCallDto {
|
|
28
34
|
Body: {
|
|
29
35
|
email: string
|
|
30
36
|
password: string
|
|
37
|
+
arguments?: unknown[]
|
|
31
38
|
}
|
|
32
39
|
}
|
|
33
40
|
|
package/src/auth/utils.ts
CHANGED
|
@@ -15,12 +15,23 @@ export const LOGIN_SCHEMA = {
|
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export const
|
|
18
|
+
export const RESET_SEND_SCHEMA = {
|
|
19
|
+
body: {
|
|
20
|
+
type: 'object',
|
|
21
|
+
properties: {
|
|
22
|
+
email: { type: 'string' }
|
|
23
|
+
},
|
|
24
|
+
required: ['email']
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const RESET_CALL_SCHEMA = {
|
|
19
29
|
body: {
|
|
20
30
|
type: 'object',
|
|
21
31
|
properties: {
|
|
22
32
|
email: { type: 'string' },
|
|
23
|
-
password: { type: 'string' }
|
|
33
|
+
password: { type: 'string' },
|
|
34
|
+
arguments: { type: 'array' }
|
|
24
35
|
},
|
|
25
36
|
required: ['email', 'password']
|
|
26
37
|
}
|
|
@@ -38,6 +49,8 @@ export const CONFIRM_RESET_SCHEMA = {
|
|
|
38
49
|
}
|
|
39
50
|
}
|
|
40
51
|
|
|
52
|
+
export const RESET_SCHEMA = RESET_SEND_SCHEMA
|
|
53
|
+
|
|
41
54
|
export const REGISTRATION_SCHEMA = {
|
|
42
55
|
body: {
|
|
43
56
|
type: 'object',
|
|
@@ -54,7 +67,8 @@ export enum AUTH_ENDPOINTS {
|
|
|
54
67
|
REGISTRATION = '/register',
|
|
55
68
|
PROFILE = '/profile',
|
|
56
69
|
SESSION = '/session',
|
|
57
|
-
RESET = '/reset/
|
|
70
|
+
RESET = '/reset/send',
|
|
71
|
+
RESET_CALL = '/reset/call',
|
|
58
72
|
CONFIRM_RESET = "/reset",
|
|
59
73
|
FIRST_USER = '/setup/first-user'
|
|
60
74
|
}
|
|
@@ -36,6 +36,6 @@ export const comparePassword = async (plaintext: string, storedPassword: string)
|
|
|
36
36
|
* > Generate a random token
|
|
37
37
|
* @param length -> the token length
|
|
38
38
|
*/
|
|
39
|
-
export const generateToken = (length =
|
|
39
|
+
export const generateToken = (length = 64) => {
|
|
40
40
|
return crypto.randomBytes(length).toString('hex')
|
|
41
41
|
}
|