Node.js护照注册

时间:2017-03-31 17:30:44

标签: javascript node.js mongodb mobile passport.js

我正在构建一个仅限移动端口的Node.js,使用Passport版本0.3.2进行本机注册。用户正在正确保存到MongoDB,但我无法发回正确的响应。这是我的代码:

passport.use('local-signup', new LocalStrategy({
        usernameField: 'email',
        passwordField: 'password',
        session: false
    },
    function(email, password, done) {
        process.nextTick(function() {
            User.findOne({
                email: email.toLowerCase()
            }, function(err, user) {
                if (err) {
                    return done(err);
                } else {
                    if (user) {
                        return done(null, false);
                    } else {

                        // Create new user if email does not exist
                        var newUser = new User();

                        // set the user's local credentials
                        newUser.email = email;
                        newUser.password = newUser.generateHash(password);

                        // save the user
                        newUser.save(function(err) {
                            if (err) {
                                console.log('throwing error: ' + err);
                                throw err;
                            }
                            console.log('the new user: ' + newUser);
                            return done(null, newUser);
                        });
                    }
                }
            });
        });
    }
));

这是我的用户模型类:

var mongoose = require('mongoose'),
Schema = mongoose.Schema,
passportLocalMongoose = require('passport-local-mongoose'),
bcrypt = require('bcrypt-nodejs'),
ObjectId = Schema.ObjectId;

var UserSchema = new Schema({
    id: String,
    email: String,
    password: String,
    dateRegistered: { type: Date, 'default': Date.now }
});

UserSchema.methods.generateHash = function(password) {
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};

// checking if password is valid
UserSchema.methods.validPassword = function(password) {
    return bcrypt.compareSync(password, this.local.password);
};

UserSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model('User', UserSchema);

而且,我在保存用户时收到500响应,如下所示:

新用户:

{ __v: 0,
  password: '$2a$08$0GaE32gxf0jdW3vdxDxWeuSjYuwsOzZmHDhrov0ujPgSOl2imoE/C',
  email: 'abcd@gmail.com',
  _id: 58de8e71078555716a76c651,
  dateRegistered: 2017-03-31T17:14:25.407Z }

响应

POST /signup 500 267.022 ms - -
Error: Failed to serialize user into session
    at pass (/Users/abcd/Developer/node-apps/flow/node_modules/passport/lib/authenticator.js:271:19)
    at Authenticator.serializeUser (/Users/abcd/Developer/node-apps/flow/node_modules/passport/lib/authenticator.js:289:5)
    at IncomingMessage.req.login.req.logIn (/Users/abcd/Developer/node-apps/flow/node_modules/passport/lib/http/request.js:50:29)
    at Strategy.strategy.success (/Users/abcd/Developer/node-apps/flow/node_modules/passport/lib/middleware/authenticate.js:235:13)
    at verified (/Users/abcd/Developer/node-apps/flow/node_modules/passport-local/lib/strategy.js:83:10)
    at /Users/abcd/Developer/node-apps/flow/server/config/passport.js:39:40
    at /Users/abcd/Developer/node-apps/flow/node_modules/mongoose/lib/model.js:3702:16
    at /Users/abcd/Developer/node-apps/flow/node_modules/mongoose/lib/services/model/applyHooks.js:146:20
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)

1 个答案:

答案 0 :(得分:0)

用户ID保存为会话数据,deserializeUser用于检索整个对象以供将来使用。serializeUser用于在会话中存储用户ID。 serializeUser方法的结果存储为req.session.passport.user = {id : 'abcd'}
另一方面deserializeUser基于参数给出了用户的对象,该参数是使用的关键意味着id。

// here user id is pass as a id of deserializeUser method to retrieve object
passport.serializeUser(function (user, done) {
    done(null,user.id);  
});
passport.deserializeUser(function (id, done) {
    customer.findById(id, function (error, user) {
        done(error, user);
    });
});


 <br />

// here user id is pass as a id of deserializeUser method to retrieve object passport.serializeUser(function (user, done) { done(null,user.id); }); passport.deserializeUser(function (id, done) { customer.findById(id, function (error, user) { done(error, user); }); }); <br />

Add bellow code to your server.js file

var express = require('express');
var session = require('express-session');
var app = express();
app.use(session({
    secret : "secretkey",
    resave : false,
    saveUninitialized : false
}));
app.use(passport.initialize());
app.use(passport.session());

//now add path where your passport authentication file is placed.
require('./customerConfig/passport');