customer-registration 0.0.116 → 0.0.118
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/.medusa/server/src/api/auth/customer/emailpass/reset-password/route.js +156 -89
- package/.medusa/server/src/api/auth/customer/emailpass/route.js +1 -1
- package/.medusa/server/src/api/auth/customer/emailpass/update/route.js +25 -27
- package/.medusa/server/src/api/auth/customer/shared/__tests__/build-unified-login-auth-data.test.js +90 -1
- package/.medusa/server/src/api/auth/customer/shared/__tests__/parse-reset-request-body.test.js +144 -0
- package/.medusa/server/src/api/auth/customer/shared/build-unified-login-auth-data.js +40 -1
- package/.medusa/server/src/api/auth/customer/shared/customer-login-post.js +1 -1
- package/.medusa/server/src/api/auth/customer/shared/parse-reset-request-body.js +75 -0
- package/.medusa/server/src/api/store/customers/me/route.js +25 -4
- package/.medusa/server/src/api/store/customers/route.js +40 -10
- package/.medusa/server/src/config.js +22 -9
- package/.medusa/server/src/helpers/reset-password.js +56 -13
- package/README.md +50 -12
- package/package.json +1 -1
|
@@ -5,21 +5,28 @@ const utils_1 = require("@medusajs/framework/utils");
|
|
|
5
5
|
const generate_jwt_token_1 = require("@medusajs/medusa/api/auth/utils/generate-jwt-token");
|
|
6
6
|
const otp_verification_1 = require("../../../../../modules/otp-verification");
|
|
7
7
|
const config_1 = require("../../../../../config");
|
|
8
|
+
const parse_reset_request_body_1 = require("../../shared/parse-reset-request-body");
|
|
8
9
|
/**
|
|
9
10
|
* Generate plain text version from HTML by stripping tags
|
|
10
11
|
*/
|
|
11
12
|
function htmlToPlainText(html) {
|
|
12
13
|
return html
|
|
13
|
-
.replace(/<[^>]*>/g, "")
|
|
14
|
-
.replace(/ /g, " ")
|
|
15
|
-
.replace(/&/g, "&")
|
|
16
|
-
.replace(/</g, "<")
|
|
17
|
-
.replace(/>/g, ">")
|
|
18
|
-
.replace(/"/g, '"')
|
|
19
|
-
.replace(/'/g, "'")
|
|
20
|
-
.replace(/\n\s*\n/g, "\n\n")
|
|
14
|
+
.replace(/<[^>]*>/g, "")
|
|
15
|
+
.replace(/ /g, " ")
|
|
16
|
+
.replace(/&/g, "&")
|
|
17
|
+
.replace(/</g, "<")
|
|
18
|
+
.replace(/>/g, ">")
|
|
19
|
+
.replace(/"/g, '"')
|
|
20
|
+
.replace(/'/g, "'")
|
|
21
|
+
.replace(/\n\s*\n/g, "\n\n")
|
|
21
22
|
.trim();
|
|
22
23
|
}
|
|
24
|
+
function renderPasswordResetSmsTemplate(template, vars) {
|
|
25
|
+
return template
|
|
26
|
+
.replace(/\{\{token\}\}/g, vars.token)
|
|
27
|
+
.replace(/\{\{reset_url\}\}/g, vars.reset_url)
|
|
28
|
+
.replace(/\{\{phone\}\}/g, vars.phone);
|
|
29
|
+
}
|
|
23
30
|
/**
|
|
24
31
|
* Send password reset email using notification service
|
|
25
32
|
*/
|
|
@@ -29,7 +36,6 @@ async function sendPasswordResetEmail(email, token, resetUrl, templatePath, subj
|
|
|
29
36
|
console.error("[reset-password] Notification service is not configured");
|
|
30
37
|
return;
|
|
31
38
|
}
|
|
32
|
-
// Load and render template with variables
|
|
33
39
|
const htmlContent = (0, otp_verification_1.loadAndRenderTemplate)(templatePath, {
|
|
34
40
|
token,
|
|
35
41
|
email,
|
|
@@ -38,10 +44,7 @@ async function sendPasswordResetEmail(email, token, resetUrl, templatePath, subj
|
|
|
38
44
|
if (!htmlContent) {
|
|
39
45
|
throw new Error(`Failed to load password reset template from ${templatePath}`);
|
|
40
46
|
}
|
|
41
|
-
// Generate plain text version from HTML
|
|
42
47
|
const textContent = htmlToPlainText(htmlContent);
|
|
43
|
-
// Prepare email payload matching notification service structure
|
|
44
|
-
// Include multiple fields for different SMTP provider expectations
|
|
45
48
|
const payload = {
|
|
46
49
|
to: email,
|
|
47
50
|
channel: "email",
|
|
@@ -53,127 +56,191 @@ async function sendPasswordResetEmail(email, token, resetUrl, templatePath, subj
|
|
|
53
56
|
html: htmlContent,
|
|
54
57
|
text: textContent,
|
|
55
58
|
},
|
|
56
|
-
// Root level fields for SMTP providers
|
|
57
59
|
html: htmlContent,
|
|
58
60
|
text: textContent,
|
|
59
|
-
body: htmlContent,
|
|
60
|
-
template: htmlContent,
|
|
61
|
-
subject,
|
|
61
|
+
body: htmlContent,
|
|
62
|
+
template: htmlContent,
|
|
63
|
+
subject,
|
|
62
64
|
};
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
await notificationService.create(payload);
|
|
66
|
-
}
|
|
67
|
-
else if (typeof notificationService.createNotifications === "function") {
|
|
68
|
-
await notificationService.createNotifications([payload]);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
}
|
|
65
|
+
if (typeof notificationService.create === "function") {
|
|
66
|
+
await notificationService.create(payload);
|
|
72
67
|
}
|
|
73
|
-
|
|
74
|
-
|
|
68
|
+
else if (typeof notificationService.createNotifications === "function") {
|
|
69
|
+
await notificationService.createNotifications([payload]);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function sendPasswordResetSms(phone, token, resetUrl, smsBodyTemplate, container) {
|
|
73
|
+
const notificationService = container.resolve(utils_1.Modules.NOTIFICATION);
|
|
74
|
+
if (!notificationService) {
|
|
75
|
+
console.error("[reset-password] Notification service is not configured");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const text = renderPasswordResetSmsTemplate(smsBodyTemplate, {
|
|
79
|
+
token,
|
|
80
|
+
reset_url: resetUrl,
|
|
81
|
+
phone,
|
|
82
|
+
});
|
|
83
|
+
const payload = {
|
|
84
|
+
to: phone,
|
|
85
|
+
channel: "sms",
|
|
86
|
+
content: {
|
|
87
|
+
text,
|
|
88
|
+
},
|
|
89
|
+
data: {
|
|
90
|
+
text,
|
|
91
|
+
token,
|
|
92
|
+
reset_url: resetUrl,
|
|
93
|
+
phone,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
if (typeof notificationService.create === "function") {
|
|
97
|
+
await notificationService.create(payload);
|
|
98
|
+
}
|
|
99
|
+
else if (typeof notificationService.createNotifications === "function") {
|
|
100
|
+
await notificationService.createNotifications([payload]);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function firstRow(result) {
|
|
104
|
+
const fromRows = result.rows?.[0];
|
|
105
|
+
if (fromRows && typeof fromRows === "object" && !Array.isArray(fromRows)) {
|
|
106
|
+
return fromRows;
|
|
107
|
+
}
|
|
108
|
+
const batch = result[0];
|
|
109
|
+
if (Array.isArray(batch)) {
|
|
110
|
+
const first = batch[0];
|
|
111
|
+
if (first && typeof first === "object" && !Array.isArray(first)) {
|
|
112
|
+
return first;
|
|
75
113
|
}
|
|
76
|
-
throw error;
|
|
77
114
|
}
|
|
115
|
+
return undefined;
|
|
78
116
|
}
|
|
79
117
|
/**
|
|
80
|
-
* Password reset request
|
|
81
|
-
*
|
|
82
|
-
* This endpoint matches Medusa's built-in `/auth/{actor_type}/{provider}/reset-password` route behavior.
|
|
83
|
-
* It generates a password reset token and sends an email.
|
|
84
|
-
*
|
|
85
|
-
* Note: This custom route overrides Medusa's built-in route. The subscriber listens to
|
|
86
|
-
* `auth.password_reset` event (emitted by Medusa's built-in route) but since we're overriding
|
|
87
|
-
* the route, we send the email directly here.
|
|
88
|
-
*
|
|
89
|
-
* To use Medusa's built-in route instead, remove this file and update the subscriber
|
|
90
|
-
* to listen to `auth.password_reset` event.
|
|
118
|
+
* Password reset request: `identifier` (email) or `email`, `phone`, or `email_or_phone`.
|
|
119
|
+
* Delivery and allowed fields follow `login.identifier` (see `parseResetRequestBody`).
|
|
91
120
|
*/
|
|
92
121
|
const POST = async (req, res) => {
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
122
|
+
const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
123
|
+
const pluginOptions = (0, config_1.resolveCustomerRegistrationOptions)(configModule);
|
|
124
|
+
const loginId = pluginOptions.login.identifier;
|
|
125
|
+
const parsed = (0, parse_reset_request_body_1.parseResetRequestBody)(req.body, loginId);
|
|
126
|
+
if (!pluginOptions.password_reset) {
|
|
127
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password reset is not configured for this store.");
|
|
98
128
|
}
|
|
99
|
-
const
|
|
129
|
+
const knex = req.scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
130
|
+
if (!knex) {
|
|
131
|
+
throw new Error("Database connection not available");
|
|
132
|
+
}
|
|
133
|
+
const config = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
134
|
+
const { http } = config.projectConfig;
|
|
100
135
|
try {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
136
|
+
if (parsed.channel === "email") {
|
|
137
|
+
const template = pluginOptions.password_reset.template;
|
|
138
|
+
if (!template?.trim()) {
|
|
139
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password reset email template is not configured.");
|
|
140
|
+
}
|
|
141
|
+
const normalizedEmail = parsed.email;
|
|
142
|
+
const result = await knex.raw(`SELECT id FROM customer WHERE email = ? LIMIT 1`, [normalizedEmail]);
|
|
143
|
+
const row = firstRow(result);
|
|
144
|
+
const customer_id = row?.id;
|
|
145
|
+
if (!customer_id) {
|
|
146
|
+
return res.status(201).json({});
|
|
147
|
+
}
|
|
148
|
+
const providerIdentityResult = await knex.raw(`SELECT pi.id, pi.entity_id, pi.provider, ai.id as auth_identity_id
|
|
149
|
+
FROM provider_identity pi
|
|
150
|
+
LEFT JOIN auth_identity ai ON pi.auth_identity_id = ai.id
|
|
151
|
+
WHERE pi.entity_id = ? AND pi.provider = 'emailpass'
|
|
152
|
+
LIMIT 1`, [normalizedEmail]);
|
|
153
|
+
const providerIdentity = firstRow(providerIdentityResult);
|
|
154
|
+
if (!providerIdentity?.auth_identity_id) {
|
|
155
|
+
return res.status(201).json({});
|
|
156
|
+
}
|
|
157
|
+
const authService = req.scope.resolve(utils_1.Modules.AUTH);
|
|
158
|
+
const authIdentity = await authService.retrieveAuthIdentity(providerIdentity.auth_identity_id);
|
|
159
|
+
if (!authIdentity) {
|
|
160
|
+
return res.status(201).json({});
|
|
161
|
+
}
|
|
162
|
+
const resetToken = (0, generate_jwt_token_1.generateJwtTokenForAuthIdentity)({
|
|
163
|
+
authIdentity: authIdentity,
|
|
164
|
+
actorType: "customer",
|
|
165
|
+
authProvider: "emailpass",
|
|
166
|
+
}, {
|
|
167
|
+
secret: http.jwtSecret,
|
|
168
|
+
expiresIn: "1h",
|
|
169
|
+
options: http.jwtOptions,
|
|
170
|
+
});
|
|
171
|
+
let resetUrl = "";
|
|
172
|
+
if (pluginOptions.storefrontUrl) {
|
|
173
|
+
const url = new URL("/reset-password", pluginOptions.storefrontUrl);
|
|
174
|
+
url.searchParams.set("token", resetToken);
|
|
175
|
+
url.searchParams.set("email", normalizedEmail);
|
|
176
|
+
resetUrl = url.toString();
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
await sendPasswordResetEmail(normalizedEmail, resetToken, resetUrl, template, pluginOptions.password_reset.subject, req.scope);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Do not reveal whether the account exists
|
|
183
|
+
}
|
|
184
|
+
return res.status(201).json({});
|
|
105
185
|
}
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
186
|
+
const smsBody = pluginOptions.password_reset.sms_body;
|
|
187
|
+
if (!smsBody?.trim()) {
|
|
188
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password reset SMS body is not configured.");
|
|
189
|
+
}
|
|
190
|
+
const normalizedPhone = parsed.phone;
|
|
191
|
+
const customerResult = await knex.raw(`SELECT id FROM customer WHERE phone = ? LIMIT 1`, [normalizedPhone]);
|
|
192
|
+
const customerRow = firstRow(customerResult);
|
|
193
|
+
if (!customerRow?.id) {
|
|
112
194
|
return res.status(201).json({});
|
|
113
195
|
}
|
|
114
|
-
// Get auth identity from provider_identity table
|
|
115
196
|
const providerIdentityResult = await knex.raw(`SELECT pi.id, pi.entity_id, pi.provider, ai.id as auth_identity_id
|
|
116
197
|
FROM provider_identity pi
|
|
117
198
|
LEFT JOIN auth_identity ai ON pi.auth_identity_id = ai.id
|
|
118
|
-
WHERE pi.entity_id = ? AND pi.provider = '
|
|
119
|
-
LIMIT 1`, [
|
|
120
|
-
const providerIdentity = providerIdentityResult
|
|
121
|
-
if (!providerIdentity
|
|
122
|
-
// Return success for security (don't reveal if email exists)
|
|
199
|
+
WHERE pi.entity_id = ? AND pi.provider = 'phonepass'
|
|
200
|
+
LIMIT 1`, [normalizedPhone]);
|
|
201
|
+
const providerIdentity = firstRow(providerIdentityResult);
|
|
202
|
+
if (!providerIdentity?.auth_identity_id) {
|
|
123
203
|
return res.status(201).json({});
|
|
124
204
|
}
|
|
125
|
-
// Get AUTH service to retrieve the full auth identity object
|
|
126
205
|
const authService = req.scope.resolve(utils_1.Modules.AUTH);
|
|
127
206
|
const authIdentity = await authService.retrieveAuthIdentity(providerIdentity.auth_identity_id);
|
|
128
207
|
if (!authIdentity) {
|
|
129
|
-
// Return success for security (don't reveal if email exists)
|
|
130
208
|
return res.status(201).json({});
|
|
131
209
|
}
|
|
132
|
-
// Get password reset configuration from plugin options
|
|
133
|
-
const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
134
|
-
const pluginOptions = (0, config_1.resolveCustomerRegistrationOptions)(configModule);
|
|
135
|
-
if (!pluginOptions?.password_reset?.template) {
|
|
136
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password reset template path is not configured. Please set password_reset.template in plugin options.");
|
|
137
|
-
}
|
|
138
|
-
// Generate reset token (JWT) with 1 hour expiration
|
|
139
|
-
// Using the same method Medusa's built-in route uses
|
|
140
|
-
const config = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
141
|
-
const { http } = config.projectConfig;
|
|
142
210
|
const resetToken = (0, generate_jwt_token_1.generateJwtTokenForAuthIdentity)({
|
|
143
|
-
authIdentity,
|
|
211
|
+
authIdentity: authIdentity,
|
|
144
212
|
actorType: "customer",
|
|
145
|
-
authProvider: "
|
|
213
|
+
authProvider: "phonepass",
|
|
146
214
|
}, {
|
|
147
215
|
secret: http.jwtSecret,
|
|
148
|
-
expiresIn: "1h",
|
|
216
|
+
expiresIn: "1h",
|
|
149
217
|
options: http.jwtOptions,
|
|
150
218
|
});
|
|
151
|
-
|
|
152
|
-
let resetUrl;
|
|
219
|
+
let resetUrl = "";
|
|
153
220
|
if (pluginOptions.storefrontUrl) {
|
|
154
221
|
const url = new URL("/reset-password", pluginOptions.storefrontUrl);
|
|
155
222
|
url.searchParams.set("token", resetToken);
|
|
156
|
-
url.searchParams.set("
|
|
223
|
+
url.searchParams.set("phone", normalizedPhone);
|
|
157
224
|
resetUrl = url.toString();
|
|
158
225
|
}
|
|
159
|
-
// Send password reset email
|
|
160
|
-
// Note: Medusa's built-in route would emit 'auth.password_reset' event here
|
|
161
|
-
// Since we're overriding the route, we send the email directly
|
|
162
226
|
try {
|
|
163
|
-
await
|
|
227
|
+
await sendPasswordResetSms(normalizedPhone, resetToken, resetUrl, smsBody, req.scope);
|
|
164
228
|
}
|
|
165
|
-
catch
|
|
166
|
-
//
|
|
229
|
+
catch {
|
|
230
|
+
// Do not reveal whether the account exists
|
|
167
231
|
}
|
|
168
|
-
// Return 201 (Created) to match Medusa's built-in route response
|
|
169
232
|
return res.status(201).json({});
|
|
170
233
|
}
|
|
171
234
|
catch (error) {
|
|
172
|
-
|
|
173
|
-
|
|
235
|
+
if (error instanceof utils_1.MedusaError) {
|
|
236
|
+
if (error.type === utils_1.MedusaError.Types.INVALID_DATA ||
|
|
237
|
+
error.type === utils_1.MedusaError.Types.UNAUTHORIZED) {
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
174
241
|
console.error("[reset-password] Error processing reset request:", error);
|
|
175
242
|
return res.status(201).json({});
|
|
176
243
|
}
|
|
177
244
|
};
|
|
178
245
|
exports.POST = POST;
|
|
179
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3Jlc2V0LXBhc3N3b3JkL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUEyRjtBQUUzRiwyRkFBb0c7QUFDcEcsOEVBQStFO0FBQy9FLGtEQUc4QjtBQUU5Qjs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLElBQVk7SUFDbkMsT0FBTyxJQUFJO1NBQ1IsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxtQkFBbUI7U0FDM0MsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyw0QkFBNEI7U0FDcEQsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyx1QkFBdUI7U0FDOUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxzQkFBc0I7U0FDNUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxzQkFBc0I7U0FDNUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyx3QkFBd0I7U0FDaEQsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyx1QkFBdUI7U0FDOUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyw2QkFBNkI7U0FDekQsSUFBSSxFQUFFLENBQUE7QUFDWCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxLQUFLLFVBQVUsc0JBQXNCLENBQ25DLEtBQWEsRUFDYixLQUFhLEVBQ2IsUUFBZ0IsRUFDaEIsWUFBb0IsRUFDcEIsT0FBZSxFQUNmLFNBQWM7SUFHZCxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLFlBQVksQ0FHakUsQ0FBQTtJQUVELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxL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
|
|
246
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3Jlc2V0LXBhc3N3b3JkL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHFEQUEyRjtBQUMzRiwyRkFBb0c7QUFDcEcsOEVBQStFO0FBQy9FLGtEQUc4QjtBQUM5QixvRkFBNkU7QUFHN0U7O0dBRUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxJQUFZO0lBQ25DLE9BQU8sSUFBSTtTQUNSLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1NBQ3ZCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO1NBQ3ZCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO1NBQ3RCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO1NBQ3ZCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO1NBQ3RCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDO1NBQzNCLElBQUksRUFBRSxDQUFBO0FBQ1gsQ0FBQztBQUVELFNBQVMsOEJBQThCLENBQ3JDLFFBQWdCLEVBQ2hCLElBQXlEO0lBRXpELE9BQU8sUUFBUTtTQUNaLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ3JDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQzdDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDMUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLHNCQUFzQixDQUNuQyxLQUFhLEVBQ2IsS0FBYSxFQUNiLFFBQWdCLEVBQ2hCLFlBQW9CLEVBQ3BC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
|
|
@@ -4,7 +4,7 @@ exports.POST = void 0;
|
|
|
4
4
|
const customer_login_post_1 = require("../shared/customer-login-post");
|
|
5
5
|
/**
|
|
6
6
|
* Customer login (unified): delegates to `handleCustomerLogin`.
|
|
7
|
-
* - POST + JSON body: `{ email, password }` **or** `{ phone, password }` (exactly one of email/phone),
|
|
7
|
+
* - POST + JSON body: `{ email, password }` **or** `{ phone, password }` (exactly one of email/phone), or `{ email_or_phone, password }` (value with `@` → email, otherwise → phone). Do not mix `email_or_phone` with `email` or `phone`.
|
|
8
8
|
* - Optional query params can fill missing fields on POST (see `buildUnifiedLoginAuthData`); prefer JSON body for credentials.
|
|
9
9
|
*/
|
|
10
10
|
const POST = async (req, res) => {
|
|
@@ -2,44 +2,44 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.POST = void 0;
|
|
4
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const config_1 = require("../../../../../config");
|
|
6
|
+
const parse_reset_request_body_1 = require("../../shared/parse-reset-request-body");
|
|
7
|
+
function isUpdateProviderFailure(result) {
|
|
8
|
+
if (result == null) {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
if (typeof result === "object" && "success" in result && result.success === false) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
5
16
|
/**
|
|
6
|
-
* Password reset completion
|
|
7
|
-
*
|
|
8
|
-
* This endpoint uses Medusa's built-in AUTH module updateProvider method
|
|
9
|
-
* to update the customer's password. The AUTH module handles:
|
|
10
|
-
* 1. Token validation (from Authorization header)
|
|
11
|
-
* 2. Password hashing
|
|
12
|
-
* 3. Database updates
|
|
13
|
-
*
|
|
14
|
-
* This matches Medusa's built-in `/auth/{actor_type}/{provider}/update` route behavior.
|
|
17
|
+
* Password reset completion: `Authorization: Bearer {token}` plus `password` and
|
|
18
|
+
* exactly one of `identifier` (email), `email`, `phone`, or `email_or_phone` (gated by `login.identifier`).
|
|
15
19
|
*/
|
|
16
20
|
const POST = async (req, res) => {
|
|
17
|
-
const {
|
|
18
|
-
// Get token from Authorization header (required by Medusa's built-in route)
|
|
21
|
+
const { password } = req.body;
|
|
19
22
|
const resetToken = req.headers.authorization?.replace("Bearer ", "");
|
|
20
23
|
if (!resetToken) {
|
|
21
24
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Reset token is required. Provide it in the 'Authorization: Bearer {token}' header");
|
|
22
25
|
}
|
|
23
|
-
if (!email || typeof email !== "string" || !email.trim()) {
|
|
24
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Email is required");
|
|
25
|
-
}
|
|
26
26
|
if (!password || typeof password !== "string" || password.length < 8) {
|
|
27
27
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Password is required and must be at least 8 characters");
|
|
28
28
|
}
|
|
29
|
-
const
|
|
29
|
+
const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
30
|
+
const pluginOptions = (0, config_1.resolveCustomerRegistrationOptions)(configModule);
|
|
31
|
+
const loginId = pluginOptions.login.identifier;
|
|
32
|
+
const parsed = (0, parse_reset_request_body_1.parseResetRequestBody)(req.body, loginId);
|
|
33
|
+
const provider = parsed.channel === "email" ? "emailpass" : "phonepass";
|
|
34
|
+
const entity_id = parsed.channel === "email" ? parsed.email : parsed.phone;
|
|
30
35
|
try {
|
|
31
|
-
// Get AUTH service
|
|
32
36
|
const authService = req.scope.resolve(utils_1.Modules.AUTH);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const result = await authService.updateProvider("emailpass", {
|
|
37
|
-
entity_id: normalizedEmail,
|
|
38
|
-
password: password,
|
|
37
|
+
const result = await authService.updateProvider(provider, {
|
|
38
|
+
entity_id,
|
|
39
|
+
password,
|
|
39
40
|
token: resetToken,
|
|
40
41
|
});
|
|
41
|
-
|
|
42
|
-
if (!result) {
|
|
42
|
+
if (isUpdateProviderFailure(result)) {
|
|
43
43
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "Failed to reset password. Invalid or expired token.");
|
|
44
44
|
}
|
|
45
45
|
return res.status(200).json({
|
|
@@ -48,14 +48,12 @@ const POST = async (req, res) => {
|
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
50
|
catch (error) {
|
|
51
|
-
// Re-throw MedusaError as-is
|
|
52
51
|
if (error instanceof utils_1.MedusaError) {
|
|
53
52
|
throw error;
|
|
54
53
|
}
|
|
55
|
-
// Handle unexpected errors
|
|
56
54
|
console.error("[reset-password-complete] Unexpected error:", error);
|
|
57
55
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to reset password: ${error instanceof Error ? error.message : String(error)}`);
|
|
58
56
|
}
|
|
59
57
|
};
|
|
60
58
|
exports.POST = POST;
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2F1dGgvY3VzdG9tZXIvZW1haWxwYXNzL3VwZGF0ZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBMkY7QUFDM0Ysa0RBRzhCO0FBQzlCLG9GQUE2RTtBQVM3RSxTQUFTLHVCQUF1QixDQUFDLE1BQTRCO0lBQzNELElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUNELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLFNBQVMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUNsRixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUE2QixDQUFBO0lBRXRELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFFcEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG1GQUFtRixDQUNwRixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckUsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsd0RBQXdELENBQ3pELENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ3BDLGlDQUF5QixDQUFDLGFBQWEsQ0FDbkIsQ0FBQTtJQUN0QixNQUFNLGFBQWEsR0FBRyxJQUFBLDJDQUFrQyxFQUFDLFlBQVksQ0FBQyxDQUFBO0lBQ3RFLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsVUFBbUMsQ0FBQTtJQUV2RSxNQUFNLE1BQU0sR0FBRyxJQUFBLGdEQUFxQixFQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFFdkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFBO0lBQ3ZFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFBO0lBRTFFLElBQUksQ0FBQztRQUNILE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBS2pELENBQUE7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO1lBQ3hELFNBQVM7WUFDVCxRQUFRO1lBQ1IsS0FBSyxFQUFFLFVBQVU7U0FDbEIsQ0FBQyxDQUFBO1FBRUYsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHFEQUFxRCxDQUN0RCxDQUFBO1FBQ0gsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsT0FBTyxFQUFFLDZCQUE2QjtZQUN0QyxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLFlBQVksbUJBQVcsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sS0FBSyxDQUFBO1FBQ2IsQ0FBQztRQUVELE9BQU8sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDbkUsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyw2QkFBNkIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3RGLENBQUE7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFBO0FBbEVZLFFBQUEsSUFBSSxRQWtFaEIifQ==
|
package/.medusa/server/src/api/auth/customer/shared/__tests__/build-unified-login-auth-data.test.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const vitest_1 = require("vitest");
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
5
|
const build_unified_login_auth_data_1 = require("../build-unified-login-auth-data");
|
|
5
6
|
function makeReq(partial) {
|
|
6
7
|
return {
|
|
@@ -44,11 +45,99 @@ function makeReq(partial) {
|
|
|
44
45
|
}),
|
|
45
46
|
wantBody: { email: "x@y.com", password: "pw" },
|
|
46
47
|
},
|
|
48
|
+
{
|
|
49
|
+
name: "email_or_phone with @ becomes email",
|
|
50
|
+
req: makeReq({
|
|
51
|
+
body: { email_or_phone: "user@example.com", password: "pw" },
|
|
52
|
+
}),
|
|
53
|
+
wantBody: { email: "user@example.com", password: "pw" },
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "email_or_phone without @ becomes phone",
|
|
57
|
+
req: makeReq({
|
|
58
|
+
body: { email_or_phone: "+919898120674", password: "pw" },
|
|
59
|
+
}),
|
|
60
|
+
wantBody: { phone: "+919898120674", password: "pw" },
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "email_or_phone trimmed",
|
|
64
|
+
req: makeReq({
|
|
65
|
+
body: { email_or_phone: " a@b.co ", password: "x" },
|
|
66
|
+
}),
|
|
67
|
+
wantBody: { email: "a@b.co", password: "x" },
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: "email_or_phone phone trimmed",
|
|
71
|
+
req: makeReq({
|
|
72
|
+
body: { email_or_phone: " +15550001 ", password: "x" },
|
|
73
|
+
}),
|
|
74
|
+
wantBody: { phone: "+15550001", password: "x" },
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: "query email_or_phone fills when body omits it",
|
|
78
|
+
req: makeReq({
|
|
79
|
+
body: { password: "secret" },
|
|
80
|
+
query: { email_or_phone: "+15551234" },
|
|
81
|
+
}),
|
|
82
|
+
wantBody: { phone: "+15551234", password: "secret" },
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: "body email_or_phone overrides query email_or_phone",
|
|
86
|
+
req: makeReq({
|
|
87
|
+
body: { email_or_phone: "pick@me.com", password: "p1" },
|
|
88
|
+
query: { email_or_phone: "+1999", password: "p2" },
|
|
89
|
+
}),
|
|
90
|
+
wantBody: { email: "pick@me.com", password: "p1" },
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: "array query email_or_phone takes first string",
|
|
94
|
+
req: makeReq({
|
|
95
|
+
body: {},
|
|
96
|
+
query: { email_or_phone: ["z@w.com", "a@b.com"], password: "pw" },
|
|
97
|
+
}),
|
|
98
|
+
wantBody: { email: "z@w.com", password: "pw" },
|
|
99
|
+
},
|
|
47
100
|
];
|
|
48
101
|
vitest_1.it.each(cases)("$name", ({ req, wantBody }) => {
|
|
49
102
|
const auth = (0, build_unified_login_auth_data_1.buildUnifiedLoginAuthData)(req);
|
|
50
103
|
(0, vitest_1.expect)(auth.body).toEqual(wantBody);
|
|
51
104
|
(0, vitest_1.expect)(auth.query).toBe(req.query);
|
|
52
105
|
});
|
|
106
|
+
const errorCases = [
|
|
107
|
+
{
|
|
108
|
+
name: "email_or_phone with email",
|
|
109
|
+
req: makeReq({
|
|
110
|
+
body: {
|
|
111
|
+
email_or_phone: "x@y.com",
|
|
112
|
+
email: "a@b.co",
|
|
113
|
+
password: "p",
|
|
114
|
+
},
|
|
115
|
+
}),
|
|
116
|
+
wantMessageSubstring: "email_or_phone together",
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: "email_or_phone with phone",
|
|
120
|
+
req: makeReq({
|
|
121
|
+
body: {
|
|
122
|
+
email_or_phone: "+1555",
|
|
123
|
+
phone: "+1666",
|
|
124
|
+
password: "p",
|
|
125
|
+
},
|
|
126
|
+
}),
|
|
127
|
+
wantMessageSubstring: "email_or_phone together",
|
|
128
|
+
},
|
|
129
|
+
];
|
|
130
|
+
vitest_1.it.each(errorCases)("$name", ({ req, wantMessageSubstring }) => {
|
|
131
|
+
try {
|
|
132
|
+
(0, build_unified_login_auth_data_1.buildUnifiedLoginAuthData)(req);
|
|
133
|
+
vitest_1.expect.fail("expected MedusaError");
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
(0, vitest_1.expect)(e).toBeInstanceOf(utils_1.MedusaError);
|
|
137
|
+
const err = e;
|
|
138
|
+
(0, vitest_1.expect)(err.type).toBe(utils_1.MedusaError.Types.INVALID_DATA);
|
|
139
|
+
(0, vitest_1.expect)(err.message).toContain(wantMessageSubstring);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
53
142
|
});
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtdW5pZmllZC1sb2dpbi1hdXRoLWRhdGEudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvYXV0aC9jdXN0b21lci9zaGFyZWQvX190ZXN0c19fL2J1aWxkLXVuaWZpZWQtbG9naW4tYXV0aC1kYXRhLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBNkM7QUFFN0MscURBQXVEO0FBQ3ZELG9GQUE0RTtBQUU1RSxTQUFTLE9BQU8sQ0FBQyxPQUdoQjtJQUNDLE9BQU87UUFDTCxHQUFHLEVBQUUsMEJBQTBCO1FBQy9CLE9BQU8sRUFBRSxFQUFFO1FBQ1gsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtRQUMxQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsUUFBUSxFQUFFLE1BQU07S0FDQSxDQUFBO0FBQ3BCLENBQUM7QUFFRCxJQUFBLGlCQUFRLEVBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO0lBQ3pDLE1BQU0sS0FBSyxHQUlOO1FBQ0g7WUFDRSxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLEdBQUcsRUFBRSxPQUFPLENBQUM7Z0JBQ1gsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO2FBQ3pDLENBQUM7WUFDRixRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7U0FDN0M7UUFDRDtZQUNFLElBQUksRUFBRSxxQ0FBcUM7WUFDM0MsR0FBRyxFQUFFLE9BQU8sQ0FBQztnQkFDWCxJQUFJLEVBQUUsRUFBRTtnQkFDUixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7YUFDOUMsQ0FBQztZQUNGLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFB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
|