在FeathersJS项目中实现修改密码功能时哈希比对失败如何解决
FeathersJS密码校验问题解决方案
你遇到的问题是因为哈希加密采用了随机加盐机制,不能通过重新生成哈希的方式做比对,也不能直接将明文和哈希字符串做相等判断,直接使用Feathers内置的密码比对工具即可解决:
1. 引入校验工具
从@feathersjs/authentication-local模块引入配套的哈希比对工具:
// CommonJS 导入方式 const { passwordHash } = require('@feathersjs/authentication-local'); // ESM 导入方式 // import { passwordHash } from '@feathersjs/authentication-local';
2. 改写校验钩子逻辑
async function checkPassword(context) { // 获取用户输入的明文旧密码 const oldPassword = context.data.oldPassword; // 从context中获取app实例,查询对应用户的存储密码 const user = await context.app.service('users').get(context.id); // 调用内置比对方法:入参分别为明文密码、数据库存储的哈希值 const isValid = await passwordHash.compare(oldPassword, user.password); if (isValid) { // 校验通过返回context,继续执行后续钩子逻辑 return context; } else { // 校验不通过直接抛出错误,自动拦截请求 throw new Error('旧密码输入错误,请重试'); } }
注意事项
- 不要尝试用
hashPassword()处理输入的旧密码再和数据库哈希比对,该方法每次生成哈希时都会自动生成新的随机盐,相同明文每次生成的结果必然不同,这是密码存储的标准安全设计 - 不要直接将明文密码和数据库存储的哈希字符串做相等判断,二者格式完全不同
- 优先从
context.app获取服务实例,避免全局引入app导致的循环依赖问题
内容的提问来源于stack exchange,提问作者Sibtain Wani
相关产品推荐
相关产品推荐

