为什么Strapi后端中bcrypt.compare()密码比对始终返回false?
问题原因及解决方案
直接调用Strapi内置校验方法
你提供的User.js服务中已经封装了现成的validatePassword方法,优先调用该方法即可,不要单独引入bcrypt做比对,避免出现依赖包不一致的问题——比如你控制器内引入的是bcrypt而服务内用的是bcryptjs,不同包的加密规则差异会直接导致比对失败。
控制器代码修改参考:
const comparePass = await strapi.plugins['users-permissions'].services.user.validatePassword(oldPassword, user.password); if(comparePass){ // 不要用ctx.throw返回成功响应,throw仅用于抛出错误 ctx.body = { message: 'valid password !' }; ctx.status = 200; }else{ ctx.throw(400, 'wrong password !') }
排查用户查询逻辑
Strapi默认的用户查询会自动隐藏password字段,你需要确认查询用户时显式指定了返回password字段,避免拿到空值或undefined导致比对失败,建议加一层非空校验:
if(!oldPassword || !user?.password) { ctx.throw(400, '参数缺失'); }
校验入参隐形字符
调试打印的oldPassword看起来是正常的maddie,但要确认是否存在前后空格、换行符等隐形字符,比对前可先做trim处理:
const processedOldPwd = oldPassword.trim(); const comparePass = await strapi.plugins['users-permissions'].services.user.validatePassword(processedOldPwd, user.password);
确认哈希有效性
如果以上操作都无效,可以手动用你服务里的hash方法为maddie生成哈希,和数据库中存储的哈希做比对,若不一致说明注册环节哈希生成逻辑存在问题。
内容的提问来源于stack exchange,提问作者taurOan
相关产品推荐
相关产品推荐

