【问题标题】:my nodejs bcrypt compare not working properly我的 nodejs bcrypt 比较无法正常工作
【发布时间】:2019-07-10 20:33:14
【问题描述】:

我正在使用 apollo 构建一个带有节点 qraphQl 的应用程序,我正在尝试创建一个登录页面,但在注册之后我尝试登录,我的 bcrypt 将始终返回 false,

在我的用户模型中

import bcrypt from 'bcryptjs';

const user = (sequelize, DataTypes) => {
  const User = sequelize.define('user', {    
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      unique: true,
      primaryKey: true,
      field: 'id'
    },
    fullname: DataTypes.STRING,
    username: {
      type: DataTypes.STRING,
      allowNull: false,
      validate: {
        notEmpty: true,
      },
    },
    email: {
      type: DataTypes.STRING,
      allowedNull: false,
      validate: {
        notEmpty: true,
        isEmail: true, 
      }
    },
    password: {
      type: DataTypes.STRING,
      allowedNull: false,
      validate: {
        notEmpty: true,
        len: [7, 42],
      },
    },
    role: { 
      type: DataTypes.ENUM,
      values: ['ADMIN', 'INSTRUCTOR', 'STUDENT'],
      defaultValue: 'STUDENT'
    }
  });

  User.beforeCreate(async user => {
    user.password = await user.generatePasswordHash()
  });
  User.beforeSave(async user => {
    user.password = await user.generatePasswordHash()
  });

  User.prototype.generatePasswordHash = async function() {
    const saltRounds = 10;
    return await bcrypt.hash(this.password, saltRounds)
  };

  User.prototype.validatePassword = async function(password) {
    return await bcrypt.compare(password, this.password);
  };

  User.associate = models => {
    User.hasMany(models.Message, { onDelete: 'CASCADE' });
  };

  User.findByLogin = async login => {
    let user = await User.findOne({
      where: { username: login },
    });

    if (!user) {
      user = await User.findOne({
        where: { email: login },
      });
    }

    return user;
  };

  return User;
};

export default user;

在我的用户解析器中,这里是代码

import { combineResolvers } from 'graphql-resolvers';
import Joi from 'joi'
import { isAuthenticated, isAdmin } from './authorization';
import {SignUp, SignIn} from '../functions/joi'
import {createToken} from '../functions/jwt'

export default {

  Mutation: {
    signUp: async (parent, { username, fullname, email, password, Rpassword}, { models, secret }) => {
      if(password !== Rpassword){
        return new Error('Password did not match')
      }
      var thejoi = { username, fullname, email, password }
      const checkUserEm = await models.User.find({ where: { email: email }})
      if (checkUserEm) {
          return new Error('Email address already Exist')
      }
      const checkUserUs = await models.User.find({ where: { username: username }})
      if (checkUserUs) {
          return new Error('Username already Exist')
      }

      await Joi.validate(thejoi, SignUp, {abortEarly:false})
      const user = await models.User.create({
        username, 
        fullname, 
        email,
        password,
        role:'STUDENT'
      });
      return { token: createToken(user) };
    },
    signIn: async (parent, { login, password }, { models, secret }, ) => {
      var varrh = { password }
      await Joi.validate(varrh, SignIn, {abortEarly:false})
      const user = await models.User.findByLogin(login);

      if (!user) {
        return new Error('No user found with this login credentials.');
      }

      const isValid = await user.validatePassword(password);
      if (!isValid) { 
        return new Error('Invalid password .');
      }

      return { token: createToken(user) };
    }
  },
  User: {
    messages: async (user, args, { models }) => {
      return await models.Message.findAll({
        where: {
          userId: user.id
        }
      });
    },
  },
}

真的很困惑,因为它应该可以工作,我已经搜索了谷歌,但它没有帮助我,请问我该如何解决这个问题,谢谢

【问题讨论】:

    标签: node.js graphql bcrypt


    【解决方案1】:

    在 generatePasswordHash 内部,您引用了 this,但您还为 beforeCreate 和 beforeSave 挂钩使用箭头函数。

    两种选择:

    1. 不要对beforeCreate 和beforeSave 钩子使用箭头函数。
    User.beforeCreate(async function (user) {
      user.password = await user.generatePasswordHash()
    });
    
    User.beforeSave(async function (user) {
      user.password = await user.generatePasswordHash()
    });
    
    1. 为generatePasswordHash 提供user 对象并将this 替换为user。
    User.beforeCreate(async user => {
      user.password = await user.generatePasswordHash(user)
    });
    
    User.beforeSave(async user => {
      user.password = await user.generatePasswordHash(user)
    });
    
    User.prototype.generatePasswordHash = async function(user) {
        const saltRounds = 10;
        return await bcrypt.hash(user.password, saltRounds)
    };
    

    【讨论】:

    • 请问我该怎么做选项 2
    • 我应该使用这个 User.prototype.generatePasswordHash = async function() { const saltRounds = 10; return await bcrypt.hash(user.password, saltRounds) };
    • 我在 validatePassword 中做了 console.log(this.password),我得到的密码与数据库中的密码相同,但它仍然返回 false
    • 数据库应该包含散列密码而不是真实密码。
    • 它包含你的散列密码
    猜你喜欢
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多