如何自定义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
相关产品推荐
相关产品推荐

