【问题标题】:Getting "Error: the string "Not a valid BCrypt hash." was thrown, throw an Error :)" during Mocha ExpressJS testing在 Mocha ExpressJS 测试期间出现“错误:字符串“不是有效的 BCrypt 哈希。”被抛出,抛出错误 :)”
【发布时间】:2015-09-01 20:12:12
【问题描述】:

我有一个使用 Passport 进行身份验证的 MEAN 堆栈应用程序。

我正在尝试编写一个登录单元测试并检查您是否被重定向到根目录 (/)。但是,每当我运行 Mocha 时,都会收到以下错误消息:

1) POST /home Login test should redirect to / after login:
   Error: the string "Not a valid BCrypt hash." was thrown, throw an Error :)

这是我的单元测试LoginSpec.js

var should = require("should");
var app = require("../app");
var mongoose = require("mongoose");
var User = mongoose.model("User");
var request = require("supertest");
var agent = request.agent(app);
...
describe('POST /home', function() {
    before(function(done) {
        user = new User({
            email: "john@email.com",
            firstName: "John",
            lastName: "Doe",
            password: "strongPassword",
            username: "johndoe"
        });

        user.save(done);
    })

    describe('Login test', function() {
        it ('should redirect to / after login', function(done) {
            agent.post('/login')
                .send({
                    username: 'johndoe',
                    password: 'strongPassword'
                })
                .end(function(err, res) {
                    done();
                })
        })

        after(function(done) {
            User.remove().exec();
            return done();
        })
    })
})

我需要 BCrype 我的密码吗?如果是这样,我该怎么做?

另外,我看到的一些在线登录示例为什么不这样做?如NodeJS/Passport - Testing user login with mocha and superagentHow to authenticate Supertest requests with Passport?

【问题讨论】:

    标签: node.js express mocha.js passport.js supertest


    【解决方案1】:

    我想我会回答这个问题,因为我遇到了同样的问题并且找不到任何直接答案。

    在您定义新用户的地方,您需要使用 bcrypt 来加密该密码,当您登录时,您还需要使用 bcrypt 将密码与您获取的用户中保存的密码进行比较。否则你会继续收到“Not a valid BCrypt hash”的问题。

    这是我在我的应用中使用的一个简单的加密和比较功能

    UserSchema.methods.encryptPassword = function(password) {
        return bcrypt.hashSync(password, bcrypt.genSaltSync(10));
    }
    
    UserSchema.methods.validPassword = function(password) {
        return bcrypt.compareSync(password, this.password);
    }
    

    更多信息可以在这里找到:https://www.npmjs.com/package/bcrypt

    【讨论】:

      【解决方案2】:

      这是因为您在数据库中的密码字段只有一个字符串,而不是散列字符串。

      它必须像$2a$08$LMXAGOARNn4XmnC/rQuhfujrWVwgK/RuHuGpLtXvcv/yruY1v3yXa 但可能只是原始密码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多