Phone Strapi中的号码认证

Phone Number authentication in Strapi

我正在为我的 android 应用程序使用 Strapi,我需要通过他们的 phone 号码登录用户。有许多身份验证提供程序,如电子邮件和密码、google、facebook 等。但我找不到任何有关添加 phone 号码身份验证的文档。请帮忙。

我想你可以对 auth.js
添加一些更改 该文件在 address

你可以看到login例如

这是可以做到的。 您必须使用 自定义概念 来自定义 users-permissions 插件的 callback 功能。

首先,您应该在 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 */
  },
};