Phone Strapi中的号码认证
Phone Number authentication in Strapi
我正在为我的 android 应用程序使用 Strapi,我需要通过他们的 phone 号码登录用户。有许多身份验证提供程序,如电子邮件和密码、google、facebook 等。但我找不到任何有关添加 phone 号码身份验证的文档。请帮忙。
我想你可以对 auth.js
添加一些更改
该文件在 address
上
你可以看到login例如
这是可以做到的。
您必须使用 自定义概念 来自定义 users-permissions
插件的 callback
功能。
- 自定义概念 - https://strapi.io/documentation/v3.x/concepts/customization.html#plugin-extensions
- 要更新的函数 - https://github.com/strapi/strapi/blob/master/packages/strapi-plugin-users-permissions/controllers/Auth.js#L21
- 例如:
首先,您应该在 User
模型中定义 phone_number
字段。
然后,您应该通过在 const query = { provider };
下添加 query.phone_number = params.identifier;
来覆盖 extensions/users-permissions/controllers/Auth.js
const query = { provider };
// Check if the provided identifier is an email or not.
const isEmail = emailRegExp.test(params.identifier);
// Set the identifier to the appropriate query field.
if (isEmail) {
query.email = params.identifier.toLowerCase();
} else {
query.phone_number = params.identifier;
}
在这个例子中,我们告诉 Strapi 我们可以通过输入电子邮件或 phone 号码来登录。
如果您只想使用 phone 号码登录,您可以删除 if 条件并只写 query.phone_number = params.identifier;
。
@Ghadban125 的回答是正确的,不过我想补充一些细节。
不仅需要覆盖./node_modules/@strapi/plugin-users-permissions/server/controllers/auth.js
中的callback
函数。您还需要在 strapi-server.js
中注册您的新函数(您在 src
目录下创建的函数,而不是 node_modules
下的函数,类似于覆盖 callback
函数)看起来像这样:
const { callback } = require("./controllers/Auth.js");
const utils = require("@strapi/utils");
const { ApplicationError } = utils.errors;
module.exports = (plugin) => {
plugin.controllers.auth.callback = async (ctx) => {
try {
await callback(ctx);
// ctx.send(result);
} catch (error) {
throw new ApplicationError(error.message);
}
};
}
您还需要将请求的 identifier
区分为电子邮件、用户名或 phone 号码。为此,您需要编辑 ./src/extensions/users-permissions/controllers/auth.js
文件:
/* left out for brevity */
const phoneNumberRegExp = /^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$/;
/* left out for brevity */
module.exports = {
async callback(ctx) {
/* left out for brevity */
const query = { provider };
// Check if the provided identifier is an email or not.
const isEmail = emailRegExp.test(params.identifier);
// Check if the provided identifier is a phone number or not.
const isPhoneNumber = phoneNumberRegExp.test(params.identifier);
// Set the identifier to the appropriate query field.
if (isEmail) {
query.email = params.identifier.toLowerCase();
} else if (isPhoneNumber) {
query.phoneNumber = params.identifier;
} else {
query.username = params.identifier;
}
/* left out for brevity */
},
};
我正在为我的 android 应用程序使用 Strapi,我需要通过他们的 phone 号码登录用户。有许多身份验证提供程序,如电子邮件和密码、google、facebook 等。但我找不到任何有关添加 phone 号码身份验证的文档。请帮忙。
我想你可以对 auth.js
添加一些更改
该文件在 address
你可以看到login例如
这是可以做到的。
您必须使用 自定义概念 来自定义 users-permissions
插件的 callback
功能。
- 自定义概念 - https://strapi.io/documentation/v3.x/concepts/customization.html#plugin-extensions
- 要更新的函数 - https://github.com/strapi/strapi/blob/master/packages/strapi-plugin-users-permissions/controllers/Auth.js#L21
- 例如:
首先,您应该在 User
模型中定义 phone_number
字段。
然后,您应该通过在 const query = { provider };
query.phone_number = params.identifier;
来覆盖 extensions/users-permissions/controllers/Auth.js
const query = { provider };
// Check if the provided identifier is an email or not.
const isEmail = emailRegExp.test(params.identifier);
// Set the identifier to the appropriate query field.
if (isEmail) {
query.email = params.identifier.toLowerCase();
} else {
query.phone_number = params.identifier;
}
在这个例子中,我们告诉 Strapi 我们可以通过输入电子邮件或 phone 号码来登录。
如果您只想使用 phone 号码登录,您可以删除 if 条件并只写 query.phone_number = params.identifier;
。
@Ghadban125 的回答是正确的,不过我想补充一些细节。
不仅需要覆盖./node_modules/@strapi/plugin-users-permissions/server/controllers/auth.js
中的callback
函数。您还需要在 strapi-server.js
中注册您的新函数(您在 src
目录下创建的函数,而不是 node_modules
下的函数,类似于覆盖 callback
函数)看起来像这样:
const { callback } = require("./controllers/Auth.js");
const utils = require("@strapi/utils");
const { ApplicationError } = utils.errors;
module.exports = (plugin) => {
plugin.controllers.auth.callback = async (ctx) => {
try {
await callback(ctx);
// ctx.send(result);
} catch (error) {
throw new ApplicationError(error.message);
}
};
}
您还需要将请求的 identifier
区分为电子邮件、用户名或 phone 号码。为此,您需要编辑 ./src/extensions/users-permissions/controllers/auth.js
文件:
/* left out for brevity */
const phoneNumberRegExp = /^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$/;
/* left out for brevity */
module.exports = {
async callback(ctx) {
/* left out for brevity */
const query = { provider };
// Check if the provided identifier is an email or not.
const isEmail = emailRegExp.test(params.identifier);
// Check if the provided identifier is a phone number or not.
const isPhoneNumber = phoneNumberRegExp.test(params.identifier);
// Set the identifier to the appropriate query field.
if (isEmail) {
query.email = params.identifier.toLowerCase();
} else if (isPhoneNumber) {
query.phoneNumber = params.identifier;
} else {
query.username = params.identifier;
}
/* left out for brevity */
},
};