customer-registration 0.0.127 → 0.0.129
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/middlewares.js +2 -7
- package/.medusa/server/src/api/store/customers/otp/__tests__/send-route.test.js +240 -0
- package/.medusa/server/src/api/store/customers/otp/__tests__/verify-route.test.js +240 -0
- package/.medusa/server/src/api/store/customers/otp/send/route.js +45 -7
- package/.medusa/server/src/api/store/customers/otp/shared/email-auth-helpers.js +62 -0
- package/.medusa/server/src/api/store/customers/otp/shared/handle-send-email-auth-otp.js +45 -0
- package/.medusa/server/src/api/store/customers/otp/shared/handle-send-phone-auth-otp.js +45 -0
- package/.medusa/server/src/api/store/customers/otp/shared/handle-verify-email-auth-otp.js +54 -0
- package/.medusa/server/src/api/store/customers/otp/shared/handle-verify-phone-auth-otp.js +54 -0
- package/.medusa/server/src/api/{auth/customer/phoneotp → store/customers/otp}/shared/phone-auth-helpers.js +1 -1
- package/.medusa/server/src/api/store/customers/otp/shared/resolve-otp-token-purpose.js +27 -0
- package/.medusa/server/src/api/store/customers/otp/verify/route.js +22 -28
- package/.medusa/server/src/api/store/customers/route.js +10 -14
- package/.medusa/server/src/api/store/customers/shared/__tests__/create-phone-only-customer.test.js +67 -0
- package/.medusa/server/src/api/store/customers/shared/create-phone-only-customer.js +43 -0
- package/.medusa/server/src/config.js +3 -3
- package/.medusa/server/src/providers/emailotp/service.js +2 -2
- package/.medusa/server/src/providers/phoneotp/service.js +2 -2
- package/.medusa/server/src/workflows/steps/resolve-or-create-email-auth-customer-step.js +2 -2
- package/.medusa/server/src/workflows/steps/resolve-or-create-phone-auth-customer-step.js +8 -47
- package/README.md +76 -114
- package/package.json +1 -1
- package/.medusa/server/src/api/auth/customer/emailotp/__tests__/send-route.test.js +0 -151
- package/.medusa/server/src/api/auth/customer/emailotp/__tests__/verify-route.test.js +0 -171
- package/.medusa/server/src/api/auth/customer/emailotp/send/route.js +0 -51
- package/.medusa/server/src/api/auth/customer/emailotp/shared/email-auth-helpers.js +0 -62
- package/.medusa/server/src/api/auth/customer/emailotp/verify/route.js +0 -54
- package/.medusa/server/src/api/auth/customer/phoneotp/__tests__/send-route.test.js +0 -153
- package/.medusa/server/src/api/auth/customer/phoneotp/__tests__/verify-route.test.js +0 -158
- package/.medusa/server/src/api/auth/customer/phoneotp/send/route.js +0 -51
- package/.medusa/server/src/api/auth/customer/phoneotp/verify/route.js +0 -54
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPhoneOnlyCustomer = createPhoneOnlyCustomer;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
function firstKnexRow(result) {
|
|
6
|
+
const fromRows = result.rows?.[0];
|
|
7
|
+
if (fromRows && typeof fromRows === "object" && !Array.isArray(fromRows)) {
|
|
8
|
+
return fromRows;
|
|
9
|
+
}
|
|
10
|
+
const batch = result[0];
|
|
11
|
+
if (Array.isArray(batch)) {
|
|
12
|
+
const first = batch[0];
|
|
13
|
+
if (first && typeof first === "object" && !Array.isArray(first)) {
|
|
14
|
+
return first;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Creates a customer with phone only (no email), blocking duplicate registered phones.
|
|
21
|
+
* Used for phone-only password registration and phone_auth OTP signup.
|
|
22
|
+
*/
|
|
23
|
+
async function createPhoneOnlyCustomer(scope, data) {
|
|
24
|
+
const phoneNormalized = data.phone.trim();
|
|
25
|
+
if (!phoneNormalized) {
|
|
26
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Phone is required for registration");
|
|
27
|
+
}
|
|
28
|
+
const knex = scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
29
|
+
const existingPhoneAccount = await knex.raw(`SELECT id FROM customer WHERE phone = ? AND has_account = true LIMIT 1`, [phoneNormalized]);
|
|
30
|
+
if (firstKnexRow(existingPhoneAccount)?.id) {
|
|
31
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.DUPLICATE_ERROR, "A customer with this phone number already has an account");
|
|
32
|
+
}
|
|
33
|
+
const customerService = scope.resolve(utils_1.Modules.CUSTOMER);
|
|
34
|
+
const [customer] = await customerService.createCustomers([
|
|
35
|
+
{
|
|
36
|
+
...data,
|
|
37
|
+
phone: phoneNormalized,
|
|
38
|
+
has_account: data.has_account ?? false,
|
|
39
|
+
},
|
|
40
|
+
]);
|
|
41
|
+
return customer;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBob25lLW9ubHktY3VzdG9tZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9zaGFyZWQvY3JlYXRlLXBob25lLW9ubHktY3VzdG9tZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwQ0EsMERBcUNDO0FBMUVELHFEQUlrQztBQUVsQyxTQUFTLFlBQVksQ0FDbkIsTUFBbUM7SUFFbkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pDLElBQUksUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN6RSxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3ZCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN0QixJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEUsT0FBTyxLQUFVLENBQUE7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBWUQ7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLHVCQUF1QixDQUMzQyxLQUFzQixFQUN0QixJQUFrQztJQUVsQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBRXpDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixvQ0FBb0MsQ0FDckMsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ25FLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUN6Qyx3RUFBd0UsRUFDeEUsQ0FBQyxlQUFlLENBQUMsQ0FDbEIsQ0FBQTtJQUVELElBQUksWUFBWSxDQUFrQixvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzVELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQ2pDLDBEQUEwRCxDQUMzRCxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQXlCLGVBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUUvRSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxlQUFlLENBQUMsZUFBZSxDQUFDO1FBQ3ZEO1lBQ0UsR0FBRyxJQUFJO1lBQ1AsS0FBSyxFQUFFLGVBQWU7WUFDdEIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSztTQUN2QztLQUNGLENBQUMsQ0FBQTtJQUVGLE9BQU8sUUFBUSxDQUFBO0FBQ2pCLENBQUMifQ==
|
|
@@ -107,12 +107,12 @@ function resolveCustomerRegistrationOptions(configModule) {
|
|
|
107
107
|
// Plugin not found in config — return all defaults so callers never get null
|
|
108
108
|
return normalizeCustomerRegistrationOptions(null);
|
|
109
109
|
}
|
|
110
|
-
/** True when the storefront may use POST /
|
|
110
|
+
/** True when the storefront may use POST /store/customers/otp/* with type email_auth */
|
|
111
111
|
function isEmailOtpAuthEnabled(options) {
|
|
112
112
|
return options.auth.email.methods.includes("otp");
|
|
113
113
|
}
|
|
114
|
-
/** True when the storefront may use POST /
|
|
114
|
+
/** True when the storefront may use POST /store/customers/otp/* with type phone_auth */
|
|
115
115
|
function isPhoneOtpAuthEnabled(options) {
|
|
116
116
|
return options.auth.phone.methods.includes("otp");
|
|
117
117
|
}
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOztBQTJFSCxvRkE0R0M7QUFFRCxnRkF5QkM7QUFHRCxzREFJQztBQUdELHNEQUlDO0FBOU5ELHFEQUFvRDtBQUtwRCxNQUFNLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQTtBQW9FM0MsU0FBZ0Isb0NBQW9DLENBQ2xELEtBQWdEO0lBRWhELE1BQU0sSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUE7SUFFeEIsTUFBTSxzQkFBc0IsR0FBb0IsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLElBQUksT0FBTyxDQUFBO0lBQ3hGLE1BQU0sZUFBZSxHQUNuQixJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsSUFBSSxzQkFBc0IsQ0FBQTtJQUVsRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQ2Isd0ZBQXdGO2dCQUN0Rix1REFBdUQsQ0FDMUQsQ0FBQTtRQUNILENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQzVFLENBQUE7UUFDRCxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FDZixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FDNUUsQ0FBQTtRQUVELElBQUksZUFBZSxLQUFLLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hELE1BQU0sSUFBSSxLQUFLLENBQ2Is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
|
|
@@ -15,7 +15,7 @@ class EmailotpAuthService extends utils_1.AbstractAuthModuleProvider {
|
|
|
15
15
|
async authenticate(_userData, _authIdentityService) {
|
|
16
16
|
return {
|
|
17
17
|
success: false,
|
|
18
|
-
error: "Use the email OTP flow: POST /
|
|
18
|
+
error: "Use the email OTP flow: POST /store/customers/otp/send (type: email_auth) then /store/customers/otp/verify",
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
21
|
async register(userData, authIdentityService) {
|
|
@@ -65,4 +65,4 @@ class EmailotpAuthService extends utils_1.AbstractAuthModuleProvider {
|
|
|
65
65
|
exports.EmailotpAuthService = EmailotpAuthService;
|
|
66
66
|
EmailotpAuthService.identifier = "emailotp";
|
|
67
67
|
EmailotpAuthService.DISPLAY_NAME = "Email OTP Authentication";
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvZW1haWxvdHAvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQSxxREFBbUY7QUFFbkYsTUFBTSxXQUFXLEdBQUcsNEJBQTRCLENBQUE7QUFNaEQsTUFBYSxtQkFBb0IsU0FBUSxrQ0FBMEI7SUFNakUsWUFBWSxFQUFFLE1BQU0sRUFBd0I7UUFDMUMsYUFBYTtRQUNiLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFBO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFBO0lBQ3ZCLENBQUM7SUFFTyxjQUFjLENBQUMsS0FBYTtRQUNsQyxPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNuQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FDaEIsU0FBOEIsRUFDOUIsb0JBQWlEO1FBRWpELE9BQU87WUFDTCxPQUFPLEVBQUUsS0FBSztZQUNkLEtBQUssRUFBRSw0R0FBNEc7U0FDcEgsQ0FBQTtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUSxDQUNaLFFBQTZCLEVBQzdCLG1CQUFnRDtRQUVoRCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBdUIsQ0FBQTtRQUU3RCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSwwQkFBMEIsRUFBRSxDQUFBO1FBQzlELENBQUM7UUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRWxELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFLENBQUE7UUFDMUQsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsUUFBUSxDQUFDO2dCQUNsRCxTQUFTLEVBQUUsZUFBZTthQUMzQixDQUFDLENBQUE7WUFDRixJQUFJLFFBQVEsRUFBRSxZQUFZLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM1RSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsQ0FBQTtZQUNqRSxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFLLEtBQXFCLENBQUMsSUFBSSxLQUFLLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNoRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUcsS0FBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUNsRSxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksWUFBWSxDQUFBO1FBQ2hCLElBQUksQ0FBQztZQUNILFlBQVksR0FBRyxNQUFNLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztnQkFDOUMsU0FBUyxFQUFFLGVBQWU7Z0JBQzFCLGlCQUFpQixFQUFFLEVBQUU7YUFDdEIsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUcsS0FBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNsRSxDQUFDO1FBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUE7SUFDeEMsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsU0FBOEIsRUFDOUIsb0JBQWlEO1FBRWpELE9BQU87WUFDTCxPQUFPLEVBQUUsS0FBSztZQUNkLEtBQUssRUFBRSx1REFBdUQ7U0FDL0QsQ0FBQTtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUNWLEtBQThCLEVBQzlCLG9CQUFpRDtRQUVqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFBO0lBQzFCLENBQUM7O0FBbkZILGtEQW9GQztBQW5GUSw4QkFBVSxHQUFHLFVBQVUsQ0FBQTtBQUN2QixnQ0FBWSxHQUFHLDBCQUEwQixDQUFBIn0=
|
|
@@ -12,7 +12,7 @@ class PhoneotpAuthService extends utils_1.AbstractAuthModuleProvider {
|
|
|
12
12
|
async authenticate(_userData, _authIdentityService) {
|
|
13
13
|
return {
|
|
14
14
|
success: false,
|
|
15
|
-
error: "Use the phone OTP flow: POST /
|
|
15
|
+
error: "Use the phone OTP flow: POST /store/customers/otp/send (type: phone_auth) then /store/customers/otp/verify",
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
18
|
async register(userData, authIdentityService) {
|
|
@@ -65,4 +65,4 @@ class PhoneotpAuthService extends utils_1.AbstractAuthModuleProvider {
|
|
|
65
65
|
exports.PhoneotpAuthService = PhoneotpAuthService;
|
|
66
66
|
PhoneotpAuthService.identifier = "phoneotp";
|
|
67
67
|
PhoneotpAuthService.DISPLAY_NAME = "Phone OTP Authentication";
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvcGhvbmVvdHAvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQSxxREFBbUY7QUFDbkYsbUVBR3FDO0FBTXJDLE1BQWEsbUJBQW9CLFNBQVEsa0NBQTBCO0lBTWpFLFlBQVksRUFBRSxNQUFNLEVBQXdCO1FBQzFDLGFBQWE7UUFDYixLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQTtRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQTtJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FDaEIsU0FBOEIsRUFDOUIsb0JBQWlEO1FBRWpELE9BQU87WUFDTCxPQUFPLEVBQUUsS0FBSztZQUNkLEtBQUssRUFBRSw0R0FBNEc7U0FDcEgsQ0FBQTtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUSxDQUNaLFFBQTZCLEVBQzdCLG1CQUFnRDtRQUVoRCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBdUIsQ0FBQTtRQUU3RCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSwwQkFBMEIsRUFBRSxDQUFBO1FBQzlELENBQUM7UUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFBLHVDQUFvQixFQUFDLEtBQUssQ0FBQyxDQUFBO1FBRW5ELElBQUksQ0FBQyw4QkFBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsS0FBSyxFQUNILDhFQUE4RTthQUNqRixDQUFBO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsUUFBUSxDQUFDO2dCQUNsRCxTQUFTLEVBQUUsZUFBZTthQUMzQixDQUFDLENBQUE7WUFDRixJQUFJLFFBQVEsRUFBRSxZQUFZLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM1RSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsb0NBQW9DLEVBQUUsQ0FBQTtZQUN4RSxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFLLEtBQXFCLENBQUMsSUFBSSxLQUFLLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNoRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUcsS0FBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUNsRSxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksWUFBWSxDQUFBO1FBQ2hCLElBQUksQ0FBQztZQUNILFlBQVksR0FBRyxNQUFNLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztnQkFDOUMsU0FBUyxFQUFFLGVBQWU7Z0JBQzFCLGlCQUFpQixFQUFFLEVBQUU7YUFDdEIsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUcsS0FBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNsRSxDQUFDO1FBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUE7SUFDeEMsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsU0FBOEIsRUFDOUIsb0JBQWlEO1FBRWpELE9BQU87WUFDTCxPQUFPLEVBQUUsS0FBSztZQUNkLEtBQUssRUFBRSx1REFBdUQ7U0FDL0QsQ0FBQTtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUNWLEtBQThCLEVBQzlCLG9CQUFpRDtRQUVqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFBO0lBQzFCLENBQUM7O0FBbkZILGtEQW9GQztBQW5GUSw4QkFBVSxHQUFHLFVBQVUsQ0FBQTtBQUN2QixnQ0FBWSxHQUFHLDBCQUEwQixDQUFBIn0=
|
|
@@ -4,7 +4,7 @@ exports.resolveOrCreateEmailAuthCustomerStep = void 0;
|
|
|
4
4
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
5
|
const utils_1 = require("@medusajs/framework/utils");
|
|
6
6
|
const core_flows_1 = require("@medusajs/core-flows");
|
|
7
|
-
const email_auth_helpers_1 = require("../../api/
|
|
7
|
+
const email_auth_helpers_1 = require("../../api/store/customers/otp/shared/email-auth-helpers");
|
|
8
8
|
const otp_verification_1 = require("../../modules/otp-verification");
|
|
9
9
|
exports.resolveOrCreateEmailAuthCustomerStep = (0, workflows_sdk_1.createStep)("resolve-or-create-email-auth-customer", async (input, stepContext) => {
|
|
10
10
|
const { container } = stepContext;
|
|
@@ -122,4 +122,4 @@ exports.resolveOrCreateEmailAuthCustomerStep = (0, workflows_sdk_1.createStep)("
|
|
|
122
122
|
is_new_user: isNewUser,
|
|
123
123
|
});
|
|
124
124
|
});
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1vci1jcmVhdGUtZW1haWwtYXV0aC1jdXN0b21lci1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9yZXNvbHZlLW9yLWNyZWF0ZS1lbWFpbC1hdXRoLWN1c3RvbWVyLXN0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQTRFO0FBRTVFLHFEQUtrQztBQUNsQyxxREFBb0U7QUFDcEUsZ0dBS2dFO0FBQ2hFLHFFQUF3RTtBQWdCM0QsUUFBQSxvQ0FBb0MsR0FBRyxJQUFBLDBCQUFVLEVBQzVELHVDQUF1QyxFQUN2QyxLQUFLLEVBQUUsS0FBb0MsRUFBRSxXQUFXLEVBQUUsRUFBRTtJQUMxRCxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsV0FBVyxDQUFBO0lBQ2pDLE1BQU0sZUFBZSxHQUFHLElBQUEsdUNBQWtCLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ2xDLDBDQUF1QixDQUN4QixDQUFBO0lBQ0QsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsSUFBSSxDQWNqRCxDQUFBO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUEsMENBQXFCLEVBQ2xELFNBQVMsRUFDVCxlQUFlLENBQ2hCLENBQUE7SUFFRCxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFDOUIsY0FBc0IsRUFDdEIsVUFBa0IsRUFDbEIsRUFBRTtRQUNGLE1BQU0sV0FBVyxDQUFDLG9CQUFvQixDQUFDO1lBQ3JDLEVBQUUsRUFBRSxjQUFjO1lBQ2xCLFlBQVksRUFBRSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUU7U0FDMUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFBO0lBRUQsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUFFLFVBQWtCLEVBQUUsRUFBRTtRQUNuRCxN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
|
|
@@ -3,16 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.resolveOrCreatePhoneAuthCustomerStep = void 0;
|
|
4
4
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
5
|
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const phone_auth_helpers_1 = require("../../api/auth/customer/phoneotp/shared/phone-auth-helpers");
|
|
6
|
+
const create_phone_only_customer_1 = require("../../api/store/customers/shared/create-phone-only-customer");
|
|
7
|
+
const phone_auth_helpers_1 = require("../../api/store/customers/otp/shared/phone-auth-helpers");
|
|
9
8
|
const otp_verification_1 = require("../../modules/otp-verification");
|
|
10
9
|
exports.resolveOrCreatePhoneAuthCustomerStep = (0, workflows_sdk_1.createStep)("resolve-or-create-phone-auth-customer", async (input, stepContext) => {
|
|
11
10
|
const { container } = stepContext;
|
|
12
11
|
const normalizedPhone = (0, phone_auth_helpers_1.normalizeAuthPhone)(input.phone);
|
|
13
|
-
const configModule = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
14
|
-
const registrationOptions = (0, config_1.resolveCustomerRegistrationOptions)(configModule);
|
|
15
|
-
const registrationIdentifier = registrationOptions.registration.identifier;
|
|
16
12
|
const otpService = container.resolve(otp_verification_1.OTP_VERIFICATION_MODULE);
|
|
17
13
|
const authService = container.resolve(utils_1.Modules.AUTH);
|
|
18
14
|
const existingCustomer = await (0, phone_auth_helpers_1.lookupCustomerByPhone)(container, normalizedPhone);
|
|
@@ -81,6 +77,7 @@ exports.resolveOrCreatePhoneAuthCustomerStep = (0, workflows_sdk_1.createStep)("
|
|
|
81
77
|
}
|
|
82
78
|
const customerPayload = {
|
|
83
79
|
phone: normalizedPhone,
|
|
80
|
+
has_account: true,
|
|
84
81
|
};
|
|
85
82
|
if (input.first_name) {
|
|
86
83
|
customerPayload.first_name = input.first_name;
|
|
@@ -91,49 +88,13 @@ exports.resolveOrCreatePhoneAuthCustomerStep = (0, workflows_sdk_1.createStep)("
|
|
|
91
88
|
let customerId;
|
|
92
89
|
let isNewUser = true;
|
|
93
90
|
if (existingCustomer && !existingCustomer.has_account) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const [created] = await customerService.createCustomers([
|
|
97
|
-
{
|
|
98
|
-
...customerPayload,
|
|
99
|
-
has_account: true,
|
|
100
|
-
},
|
|
101
|
-
]);
|
|
102
|
-
customerId = created.id;
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
const { result } = await (0, core_flows_1.createCustomerAccountWorkflow)(container).run({
|
|
106
|
-
input: {
|
|
107
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
108
|
-
customerData: customerPayload,
|
|
109
|
-
authIdentityId,
|
|
110
|
-
},
|
|
111
|
-
});
|
|
112
|
-
customerId = result.id;
|
|
113
|
-
}
|
|
91
|
+
const created = await (0, create_phone_only_customer_1.createPhoneOnlyCustomer)(container, customerPayload);
|
|
92
|
+
customerId = created.id;
|
|
114
93
|
isNewUser = false;
|
|
115
94
|
}
|
|
116
95
|
else if (!existingCustomer) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const [created] = await customerService.createCustomers([
|
|
120
|
-
{
|
|
121
|
-
...customerPayload,
|
|
122
|
-
has_account: true,
|
|
123
|
-
},
|
|
124
|
-
]);
|
|
125
|
-
customerId = created.id;
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
const { result } = await (0, core_flows_1.createCustomerAccountWorkflow)(container).run({
|
|
129
|
-
input: {
|
|
130
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
131
|
-
customerData: customerPayload,
|
|
132
|
-
authIdentityId,
|
|
133
|
-
},
|
|
134
|
-
});
|
|
135
|
-
customerId = result.id;
|
|
136
|
-
}
|
|
96
|
+
const created = await (0, create_phone_only_customer_1.createPhoneOnlyCustomer)(container, customerPayload);
|
|
97
|
+
customerId = created.id;
|
|
137
98
|
}
|
|
138
99
|
else {
|
|
139
100
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Unable to resolve customer for phone authentication");
|
|
@@ -148,4 +109,4 @@ exports.resolveOrCreatePhoneAuthCustomerStep = (0, workflows_sdk_1.createStep)("
|
|
|
148
109
|
is_new_user: isNewUser,
|
|
149
110
|
});
|
|
150
111
|
});
|
|
151
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1vci1jcmVhdGUtcGhvbmUtYXV0aC1jdXN0b21lci1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9yZXNvbHZlLW9yLWNyZWF0ZS1waG9uZS1hdXRoLWN1c3RvbWVyLXN0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQTRFO0FBRTVFLHFEQUtrQztBQUNsQyw0R0FHb0U7QUFDcEUsZ0dBS2dFO0FBQ2hFLHFFQUF3RTtBQWdCM0QsUUFBQSxvQ0FBb0MsR0FBRyxJQUFBLDBCQUFVLEVBQzVELHVDQUF1QyxFQUN2QyxLQUFLLEVBQUUsS0FBb0MsRUFBRSxXQUFXLEVBQUUsRUFBRTtJQUMxRCxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsV0FBVyxDQUFBO0lBQ2pDLE1BQU0sZUFBZSxHQUFHLElBQUEsdUNBQWtCLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRXZELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ2xDLDBDQUF1QixDQUN4QixDQUFBO0lBQ0QsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsSUFBSSxDQWNqRCxDQUFBO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUEsMENBQXFCLEVBQ2xELFNBQVMsRUFDVCxlQUFlLENBQ2hCLENBQUE7SUFFRCxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFDOUIsY0FBc0IsRUFDdEIsVUFBa0IsRUFDbEIsRUFBRTtRQUNGLE1BQU0sV0FBVyxDQUFDLG9CQUFvQixDQUFDO1lBQ3JDLEVBQUUsRUFBRSxjQUFjO1lBQ2xCLFlBQVksRUFBRSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUU7U0FDMUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFBO0lBRUQsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUFFLFVBQWtCLEVBQUUsRUFBRTtRQUNuRCxN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
|
package/README.md
CHANGED
|
@@ -123,8 +123,8 @@ npx medusa db:migrate
|
|
|
123
123
|
| `storefrontUrl` | `string` | No | `undefined` | Base storefront URL used for password reset link generation. Required when `password_reset` is configured. |
|
|
124
124
|
| `registration.identifier` | `"email" \| "phone" \| "both"` | No | `"email"` | Which identifier is used at registration. |
|
|
125
125
|
| `registration.require_verification` | `boolean` | No | `true` | Whether login requires verification flags (password login only; OTP login proves ownership). |
|
|
126
|
-
| `auth.email.methods` | `Array<"password" \| "otp">` | No | `["password"]` | Storefront auth methods. Add `"otp"` to enable
|
|
127
|
-
| `auth.phone.methods` | `Array<"password" \| "otp">` | No | `["password"]` | Storefront auth methods. Add `"otp"` to enable
|
|
126
|
+
| `auth.email.methods` | `Array<"password" \| "otp">` | No | `["password"]` | Storefront auth methods. Add `"otp"` to enable `POST /store/customers/otp/send` with `type: "email_auth"`. |
|
|
127
|
+
| `auth.phone.methods` | `Array<"password" \| "otp">` | No | `["password"]` | Storefront auth methods. Add `"otp"` to enable `POST /store/customers/otp/send` with `type: "phone_auth"`. |
|
|
128
128
|
| `login.identifier` | `"email" \| "phone" \| "both"` | No | `registration.identifier` | Which login method(s) are accepted at `/auth/customer/emailpass`. |
|
|
129
129
|
| `email_auth.channel` | `string` | Yes when OTP enabled | none | Notification channel for unified email OTP login/register. |
|
|
130
130
|
| `email_auth.template` | `string \| null` | No | plugin default | HTML template for login code emails. |
|
|
@@ -311,113 +311,18 @@ Response:
|
|
|
311
311
|
{ "message": "Password reset successfully", "success": true }
|
|
312
312
|
```
|
|
313
313
|
|
|
314
|
-
#### `POST /auth/customer/emailotp/send`
|
|
315
|
-
- Auth: Public (rate-limited: 5 requests/minute per IP)
|
|
316
|
-
- Requires: `auth.email.methods` includes `"otp"`
|
|
317
|
-
- Description: Sends a one-time code to the email. Works for new and existing customers (no separate register step).
|
|
318
|
-
|
|
319
|
-
Body:
|
|
320
|
-
|
|
321
|
-
| Field | Type | Required |
|
|
322
|
-
|---|---|---:|
|
|
323
|
-
| `email` | `string` | Yes |
|
|
324
|
-
|
|
325
|
-
Response:
|
|
326
|
-
|
|
327
|
-
```json
|
|
328
|
-
{
|
|
329
|
-
"token": "...",
|
|
330
|
-
"expires_at": "2025-06-03T12:00:00.000Z",
|
|
331
|
-
"is_new_user": true
|
|
332
|
-
}
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
`is_new_user` is `true` when no registered customer exists for that email yet.
|
|
336
|
-
|
|
337
|
-
#### `POST /auth/customer/emailotp/verify`
|
|
338
|
-
- Auth: Public
|
|
339
|
-
- Requires: `auth.email.methods` includes `"otp"`
|
|
340
|
-
- Description: Verifies the code, then logs in an existing customer or creates a new account (with `email_verified=true`).
|
|
341
|
-
|
|
342
|
-
Body:
|
|
343
|
-
|
|
344
|
-
| Field | Type | Required | Notes |
|
|
345
|
-
|---|---|---:|---|
|
|
346
|
-
| `token` | `string` | Yes | From send response. |
|
|
347
|
-
| `code` | `string` | Yes | OTP from email. |
|
|
348
|
-
| `first_name` | `string` | No | Used when creating a new customer. |
|
|
349
|
-
| `last_name` | `string` | No | Used when creating a new customer. |
|
|
350
|
-
| `referral_code` | `string` | No | Referrer customer id (same rules as `POST /store/customers`). |
|
|
351
|
-
|
|
352
|
-
Response:
|
|
353
|
-
|
|
354
|
-
```json
|
|
355
|
-
{
|
|
356
|
-
"token": "...",
|
|
357
|
-
"customer": { "id": "cus_...", "email": "..." },
|
|
358
|
-
"is_new_user": false
|
|
359
|
-
}
|
|
360
|
-
```
|
|
361
|
-
|
|
362
314
|
**Storefront flows**
|
|
363
315
|
|
|
364
|
-
- **Password (unchanged):** `POST /auth/customer/emailpass/register` → `POST /store/customers` → optional `POST /store/customers/otp/send` + `verify`
|
|
365
|
-
- **Email OTP (unified):** `POST /
|
|
366
|
-
- **
|
|
367
|
-
|
|
368
|
-
#### `POST /auth/customer/phoneotp/send`
|
|
369
|
-
- Auth: Public (rate-limited: 5 requests/minute per IP)
|
|
370
|
-
- Requires: `auth.phone.methods` includes `"otp"`
|
|
371
|
-
- Description: Sends a one-time code via SMS. Works for new and existing customers.
|
|
372
|
-
|
|
373
|
-
Body:
|
|
316
|
+
- **Password (unchanged):** `POST /auth/customer/emailpass/register` → `POST /store/customers` → optional `POST /store/customers/otp/send` + `verify` with `type: "email_verification"`.
|
|
317
|
+
- **Email OTP (unified):** `POST /store/customers/otp/send` (`type: "email_auth"`) → `POST /store/customers/otp/verify` → customer is logged in immediately (creates account with **email only**).
|
|
318
|
+
- **Phone OTP (unified):** `POST /store/customers/otp/send` (`type: "phone_auth"`) → `POST /store/customers/otp/verify` → logged in immediately (creates account with **phone only**).
|
|
319
|
+
- **Both methods:** Show a toggle such as “Continue with password” vs “Continue with email/SMS code” when `auth.email.methods` or `auth.phone.methods` includes `"otp"`.
|
|
374
320
|
|
|
375
|
-
|
|
376
|
-
|---|---|---:|
|
|
377
|
-
| `phone` | `string` | Yes |
|
|
321
|
+
> **OTP auth vs password registration:** `registration.identifier: "both"` still requires **email and phone** on password registration (`POST /auth/customer/emailpass/register` → `POST /store/customers`). OTP login/register is **channel-scoped**: whichever channel the user verifies (`email_auth` or `phone_auth`) is the only identifier required to create the account.
|
|
378
322
|
|
|
379
|
-
|
|
323
|
+
> **Breaking change:** `/auth/customer/emailotp/*` and `/auth/customer/phoneotp/*` were removed. Use `/store/customers/otp/*` with `type: "email_auth"` or `type: "phone_auth"` instead.
|
|
380
324
|
|
|
381
|
-
|
|
382
|
-
{
|
|
383
|
-
"token": "...",
|
|
384
|
-
"expires_at": "2025-06-03T12:00:00.000Z",
|
|
385
|
-
"is_new_user": true
|
|
386
|
-
}
|
|
387
|
-
```
|
|
388
|
-
|
|
389
|
-
#### `POST /auth/customer/phoneotp/verify`
|
|
390
|
-
- Auth: Public
|
|
391
|
-
- Requires: `auth.phone.methods` includes `"otp"`
|
|
392
|
-
- Description: Verifies the code, then logs in an existing customer or creates a new account (with `phone_verified=true`).
|
|
393
|
-
|
|
394
|
-
Body:
|
|
395
|
-
|
|
396
|
-
| Field | Type | Required | Notes |
|
|
397
|
-
|---|---|---:|---|
|
|
398
|
-
| `token` | `string` | Yes | From send response. |
|
|
399
|
-
| `code` | `string` | Yes | OTP from SMS. |
|
|
400
|
-
| `first_name` | `string` | No | Used when creating a new customer. |
|
|
401
|
-
| `last_name` | `string` | No | Used when creating a new customer. |
|
|
402
|
-
| `referral_code` | `string` | No | Referrer customer id. |
|
|
403
|
-
|
|
404
|
-
Response:
|
|
405
|
-
|
|
406
|
-
```json
|
|
407
|
-
{
|
|
408
|
-
"token": "...",
|
|
409
|
-
"customer": { "id": "cus_...", "phone": "+15551234567" },
|
|
410
|
-
"is_new_user": false
|
|
411
|
-
}
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
**Storefront flows (phone)**
|
|
415
|
-
|
|
416
|
-
- **Password (unchanged):** `POST /auth/customer/emailpass/register` (phone+password) → `POST /store/customers` → optional `phone_verification` OTP.
|
|
417
|
-
- **Phone OTP (unified):** `POST /auth/customer/phoneotp/send` → `POST /auth/customer/phoneotp/verify` → logged in immediately.
|
|
418
|
-
- **Both methods:** Toggle “Continue with password” vs “Continue with SMS code” when `auth.phone.methods` is `["password", "otp"]`.
|
|
419
|
-
|
|
420
|
-
For phone-only stores use `registration.identifier: "phone"` with `auth.phone.methods: ["password", "otp"]` and `phone_auth: { channel: "sms" }`.
|
|
325
|
+
For dual OTP stores use `registration.identifier: "both"`, `login.identifier: "both"`, `auth.email.methods` / `auth.phone.methods` including `"otp"`, plus `email_auth` and `phone_auth` channel config.
|
|
421
326
|
|
|
422
327
|
### Store routes
|
|
423
328
|
|
|
@@ -487,34 +392,79 @@ Response:
|
|
|
487
392
|
```
|
|
488
393
|
|
|
489
394
|
#### `POST /store/customers/otp/send`
|
|
490
|
-
- Auth: Public
|
|
491
|
-
- Description:
|
|
395
|
+
- Auth: Public (rate-limited: 5 requests/minute per IP)
|
|
396
|
+
- Description: Unified OTP send for verification and passwordless login/register.
|
|
492
397
|
|
|
493
|
-
|
|
398
|
+
**Verification** (`email_verification` / `phone_verification`):
|
|
494
399
|
|
|
495
400
|
| Field | Type | Required |
|
|
496
401
|
|---|---|---:|
|
|
497
402
|
| `customer_id` | `string` | Yes |
|
|
498
403
|
| `type` | `"email_verification" \| "phone_verification"` | Yes |
|
|
499
404
|
|
|
500
|
-
|
|
405
|
+
```bash
|
|
406
|
+
curl -X POST http://localhost:9000/store/customers/otp/send \
|
|
407
|
+
-H "Content-Type: application/json" \
|
|
408
|
+
-d '{"customer_id":"cus_...","type":"email_verification"}'
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
**Email login/register** (`email_auth`, requires `auth.email.methods` includes `"otp"`):
|
|
412
|
+
|
|
413
|
+
| Field | Type | Required |
|
|
414
|
+
|---|---|---:|
|
|
415
|
+
| `email` | `string` | Yes |
|
|
416
|
+
| `type` | `"email_auth"` | Yes |
|
|
417
|
+
|
|
418
|
+
```bash
|
|
419
|
+
curl -X POST http://localhost:9000/store/customers/otp/send \
|
|
420
|
+
-H "Content-Type: application/json" \
|
|
421
|
+
-d '{"email":"alice@example.com","type":"email_auth"}'
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
**Phone login/register** (`phone_auth`, requires `auth.phone.methods` includes `"otp"`):
|
|
425
|
+
|
|
426
|
+
| Field | Type | Required |
|
|
427
|
+
|---|---|---:|
|
|
428
|
+
| `phone` | `string` | Yes |
|
|
429
|
+
| `type` | `"phone_auth"` | Yes |
|
|
430
|
+
|
|
431
|
+
Response (verification):
|
|
501
432
|
|
|
502
433
|
```json
|
|
503
434
|
{ "token": "...", "expires_at": "..." }
|
|
504
435
|
```
|
|
505
436
|
|
|
437
|
+
Response (auth types — adds `is_new_user`):
|
|
438
|
+
|
|
439
|
+
```json
|
|
440
|
+
{
|
|
441
|
+
"token": "...",
|
|
442
|
+
"expires_at": "2025-06-03T12:00:00.000Z",
|
|
443
|
+
"is_new_user": true
|
|
444
|
+
}
|
|
445
|
+
```
|
|
446
|
+
|
|
506
447
|
#### `POST /store/customers/otp/verify`
|
|
507
448
|
- Auth: Public
|
|
508
|
-
- Description: Verifies OTP
|
|
449
|
+
- Description: Verifies OTP for verification flows or passwordless login/register (based on token purpose).
|
|
509
450
|
|
|
510
451
|
Body:
|
|
511
452
|
|
|
512
|
-
| Field | Type | Required |
|
|
513
|
-
|
|
514
|
-
| `token` | `string` | Yes |
|
|
515
|
-
| `code` | `string` | Yes |
|
|
453
|
+
| Field | Type | Required | Notes |
|
|
454
|
+
|---|---|---:|---|
|
|
455
|
+
| `token` | `string` | Yes | From send response. |
|
|
456
|
+
| `code` | `string` | Yes | OTP from email/SMS. |
|
|
457
|
+
| `first_name` | `string` | No | Auth types only — used when creating a new customer. |
|
|
458
|
+
| `last_name` | `string` | No | Auth types only. |
|
|
459
|
+
| `referral_code` | `string` | No | Auth types only — referrer customer id. |
|
|
516
460
|
|
|
517
|
-
|
|
461
|
+
```bash
|
|
462
|
+
curl -X POST http://localhost:9000/store/customers/otp/verify \
|
|
463
|
+
-H "Content-Type: application/json" \
|
|
464
|
+
-d '{"token":"OTP_TOKEN","code":"123456","first_name":"Alice"}'
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
Response (verification):
|
|
518
468
|
|
|
519
469
|
```json
|
|
520
470
|
{
|
|
@@ -526,6 +476,18 @@ Response:
|
|
|
526
476
|
}
|
|
527
477
|
```
|
|
528
478
|
|
|
479
|
+
Response (auth types):
|
|
480
|
+
|
|
481
|
+
```json
|
|
482
|
+
{
|
|
483
|
+
"verified": true,
|
|
484
|
+
"customer": { "id": "cus_...", "email": "..." },
|
|
485
|
+
"is_new_user": false,
|
|
486
|
+
"token": "...",
|
|
487
|
+
"needs_login": false
|
|
488
|
+
}
|
|
489
|
+
```
|
|
490
|
+
|
|
529
491
|
#### `POST /store/customers/change-password`
|
|
530
492
|
- Auth: Customer JWT
|
|
531
493
|
- Description: Changes password using old/new/confirm values.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "customer-registration",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.129",
|
|
4
4
|
"description": "Medusa plugin that overrides store customer registration, enforces email/phone verification flags, and provides OTP management module.",
|
|
5
5
|
"author": "Medusa (https://medusajs.com)",
|
|
6
6
|
"license": "MIT",
|