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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:36:04