You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自定义Strapi v4认证流程:用手机号替代邮箱登录

Strapi v4 手机号替代邮箱登录(保留/auth/local端点)

以下是实现该需求的具体步骤,完全基于Strapi扩展机制,无需修改核心插件代码:

1. 确认用户模型已添加手机号字段

确保你的用户表(plugin::users-permissions.user)已经添加了phone字段,且配置为唯一、必填:
在src/extensions/users-permissions/content-types/user/schema.json的attributes节点中添加:

"phone": {
  "type": "string",
  "required": true,
  "unique": true
}

(如果之前已经添加过这一步可跳过)

2. 自定义认证控制器(重写local登录逻辑)

创建扩展文件src/extensions/users-permissions/server/controllers/auth.js,重写原local登录方法,将识别逻辑从邮箱切换为手机号:

const { createCoreController } = require('@strapi/strapi').factories;
const originalAuthController = require('@strapi/plugin-users-permissions/server/controllers/auth');

module.exports = createCoreController('plugin::users-permissions.auth', ({ strapi }) => ({
  async local(ctx) {
    const { identifier, password } = ctx.request.body;

    // 按手机号查找用户(替换原逻辑的邮箱查询)
    const user = await strapi.query('plugin::users-permissions.user').findOne({
      where: { phone: identifier },
      select: ['id', 'password', 'blocked', 'confirmed'],
    });

    // 未找到用户返回统一错误
    if (!user) {
      return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.invalid' }] }]);
    }

    // 检查用户状态(封禁/未验证)
    if (user.blocked) {
      return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.blocked' }] }]);
    }
    if (!user.confirmed) {
      return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.confirmed' }] }]);
    }

    // 验证密码
    const validPassword = await strapi.service('plugin::users-permissions.user').validatePassword(password, user.password);
    if (!validPassword) {
      return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.invalid' }] }]);
    }

    // 生成JWT Token
    const token = strapi.service('plugin::users-permissions.jwt').issue({ id: user.id });

    // 返回标准化响应(和原接口格式完全一致)
    ctx.body = {
      jwt: token,
      user: await strapi.service('plugin::users-permissions.user').sanitizeUser(user),
    };
  },
}));

3. 测试接口

重启Strapi服务后,直接调用原端点POST /api/auth/local,请求体传入手机号和密码即可完成登录:

{
  "identifier": "你的手机号",
  "password": "用户密码"
}

关键说明

  • 该方案完全保留原/auth/local端点,前端无需修改请求地址,只需将原传入邮箱的参数改为手机号即可
  • 采用Strapi官方推荐的扩展机制,不会修改核心插件代码,避免后续版本更新被覆盖
  • 错误提示、响应格式与原接口完全一致,保证前后端兼容性

内容的提问来源于stack exchange,提问作者Mehran Piltan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 04:55:22