Bcrypt错误:非法参数字符串未识别

时间:2016-01-24 23:38:30

标签: node.js

这是我的完整代码

var express = require('express'),
    app = express(),
    mongoose = require('mongoose'),
    bodyParser = require('body-parser'),
    morgan = require('morgan'),
    webToken = require('jsonwebtoken'),
    bcrypt = require('bcryptjs'),
    assert = require('assert');
    Schema = mongoose.Schema,
    secretKey = "omjdiuwkslxmshsoepdukslsj";

//User Schema
var userSchema = new Schema({
    username: {type: String, required: true, index: {unique:true}},
    password: {type: String, required: true, select: false}
})

userSchema.pre('save', function(next){
    var user = this;

    if(!user.isModified('password')) return next();

    bcrypt.hash(user.password, null, null, function(err, hash){
        if(err) return next(err);

        user.password = hash;
        next();
    })
});

userSchema.methods.comparePassword = function(password){
    var user = this;

    bcrypt.compare(password, user.password, function(err, result){
        if(err){
            console.log(err);
        }
        else {
            console.log("passwords match!");
            return;
        }
    })
}

var userModel = mongoose.model('users', userSchema);


//Connecting to Mongo
mongoose.connect("mongodb://localhost/userstories", function(err){
    if(err) {
        console.log(err);
    }
    else {
        console.log("Connected to database!");
    }
});

//Creating Token
function createToken(user){
    var token = webToken.sign({
        _id: user.id,
        username: user.username
    },  secretKey,{
        expiresIn: 30 * 60 * 1000
    })
    return token;
    }

//Middlewares
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use(morgan('dev'));

//Api's

app.post('/signup', function(req, res){    
    var user = new userModel({
        username: req.body.username,
        password: req.body.password
    })

    user.save(function(err){
        if(err){
            console.log(err);
        }

        else{
            res.json({message: "User created!"});
        }
    })
})

app.post('/login', function(req, res){

    userModel.findOne({username: req.body.username}, function(err, user){
        if(err) console.log(err);

            if(!user){
                res.send("User not found!");
            }
                 else if(user){

                      var validPassword = user.comparePassword(req.body.password);

                       if(validPassword){
                                var tokens = createToken(user);

                                res.json({
                                    success: true,
                                    message: "Successfully logged In",
                                    token: tokens
                                });
                        } 

                            else {
                                    res.send("Invalid password");
                                  }

                     }
    })
});


//Running the server
app.listen(3000, function(err){
    if(err) console.log("port not working");
    else{
        console.log("Everything went just fine");
    }
})

我已尝试过所有方法,并在此处查看了所有答案。但似乎没有人遇到这种非法的争论错误。请为我弄清楚这个我确定有一个我无法看到的错误

8 个答案:

答案 0 :(得分:2)

我尝试过相同的代码进行一次身份验证,并得到了相同的错误Error: Illegal arguments: string, function

但我没有看到代码有任何问题。问题是,我已经注册了两个用户名相同且密码不同的用户。然后,当我尝试使用用户名和一个密码登录时发生此错误并停止服务器。

所以看来你也面临同样的问题。如果您不想在代码中出现错误,请确保这些内容没有错误。

答案 1 :(得分:1)

您的代码在这个地方是错误的。您可能会看到它。

var validPassword = user.comparePassword(req.body.password);

如果您使用bcryptjs这样的第三方插件

let validPassword = bcrypt.compare(req.body.password, user.password);

bcrypt.compare(密码,hashedPassword);

答案 2 :(得分:1)

在用户架构中,您将select的password字段设置为false。这意味着,只要您尝试在login请求中尝试在模式中寻找用户,就不会获得password字段或任何其他包含{ {1}}在架构中定义为false。

您需要做的就是指定找到用户后需要的密码:

select

这将仅从数据库返回app.post('/login', function(req, res){ userModel.findOne({username: req.body.username}, 'password', function(err, user){ // continue } _id。如果要返回其他字段,则必须在以下位置添加它们:

password

答案 3 :(得分:0)

I also encountered the same error when I was using bcrypt.compareSync("input to be compared with the hash", hash).

Later on I discovered that I was supposed to pass the actual value in the first input parameter i.e (The actual value from which the hash was generated) and the hash in the second input parameter, but I was passing hashed values in both the input parameters.

After correcting the same it was giving me the desired output as true or false.

You can also run and check your code here.

答案 4 :(得分:0)

在将user.password的值发送到bcrypt.compare()之前,先进行检查。

有一种可能是,您获取了用户但不包含password属性,结果值为undefined。如果您设置自定义attributes,或者您使用的是排除道具的作用域,则可能会在Sequelize中发生。

答案 5 :(得分:0)

这样做:

UserSchema.pre('save', async function (next) {
  const hash = await bcrypt.hash(this.password, 10);

  this.password = hash;
  next()
})

答案 6 :(得分:0)

您需要指定您还需要密码,因为您已将select属性设置为false。 因此,在获取用户时,只需确保明确指定您还需要密码即可。查询用户时,请在用户对象上添加l1 = [1,3,5,7] l2 = [2,4,6,8] new_list = [max(l) for l in zip(l1, l2)] print(new_list)

答案 7 :(得分:0)

在我的特定情况下,我正在处理此错误,在将近两天的时间内未成功检出所有代码。 最后,意识到MariaDB中的PASSWORD列是大写的。从理论上讲,这根本不应该影响,但我决定将其重命名为小写和流浪汉!问题解决了。