无法将用户加载到会话中

由于某种原因,testing我的身份validation ,我创build了一个用户login8 === D密码123 ,然后passportjs说,当我尝试login时,它无法序列化该用户,但与任何常规像用户名bill@kentucky.com然后它工作正常,并login序列化用户。 我也可以提供代码作为例子,但它是否具有奇怪的字符( 如'=' )呢?

另外为什么我可以用.id而不是._id来序列化,为什么这样做呢? 我使用mongoDB,它总是生成一个_id

 exports.postLogin = function(req, res, next) { // Do email and password validation for the server passport.authenticate('local', function(err, user, info) { if(err) return next(err); if(!user) { req.flash('errors', {msg: info.message}); console.log("ERROR BOYS"); } // Passport exposes a login() function on req (also aliased as logIn()) that can be used to establish a login session req.logIn(user, function(err) { console.log("User: " +user + " has been logged in"); if(err) return next(err); req.flash('success', { msg: 'Success! You are logged in'}); res.end('Success'); }); })(req, res, next); }; /** * GET /logout */ exports.getLogout = function(req, res, next) { // Do email and password validation for the server console.log("You have been logged out"); req.logout(); res.redirect('/'); }; /** * POST /signup * Create a new local account */ exports.postSignUp = function(req, res, next) { var user = new User({ email: req.body.email, password: req.body.password, profile: { firstName : req.body.firstName, lastName : req.body.lastName, section : req.body.section } }); User.findOne({email: req.body.email}, function(err, existingUser) { if(existingUser) { req.flash('errors', { msg: 'Account with that email address already exists' }); res.redirect('/sign'); } user.save(function(err) { if(err) return next(err); req.logIn(user, function(err) { if(err) return next(err); console.log('Successfully created'); console.log('Printing user'); console.log(user); console.log('Print our body from our request'); console.log(req.body); res.redirect('/'); res.end(); }); }); }); }; 

serialize部分:

 /* Initializing passport.js */ var User = require('../models/user'); var local = require('./passport/local'); /* * Expose */ module.exports = function(app, passport, config) { // serialize sessions passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); //use the following strategies passport.use(local); }; 

也许它必须与login?? ::?

 else { renderedResult = ( <div> <div className={styles['wrapper']}> <div className={styles['container']}> <h1 className={styles['welcomelogin']}>Welcome, If ya just signed up then go ahead and sign in</h1> <fieldset className = {styles['loginSet']}> <input type="text" className = {styles['form-control']} placeholder="Username" ref = "email" name = "email" /> <input type="password" className = {styles['form-control']} placeholder="Password" ref = "password" name = "password" /> <button type="submit" className={styles['login-button']} to = "dashboard" onClick={this._onLoginSubmit}>Login</button> </fieldset> <hr/> <p>Need an account? <Link to="register">Signup</Link></p> </div> </div> </div> ); }} return ( <div> {renderedResult} </div> ); } } 

用户模式:

 /** * Defining a User Model in mongoose * */ var bcrypt = require('bcrypt-nodejs'); var mongoose = require('mongoose'); var crypto = require('crypto'); // Other oauthtypes to be added /* User Schema */ var UserSchema = new mongoose.Schema({ email: { type: String, unique: true}, password: String, tokens: Array, profile: { firstName: { type: String, default: ''}, lastName: {type: String, default: ''}, gender: { type: String, default: ''}, location: { type: String, default: ''}, website: { type: String, default: ''}, picture: { type: String, default: ''}, section: { type: String, default: ''} }, resetPasswordToken: String, resetPasswordExpires: Date, google: {}, isStaff : { type: Boolean, default: false} }); /** * Password hash middleware. */ UserSchema.pre('save', function(next) { var user = this; if (!user.isModified('password')) return next(); bcrypt.genSalt(5, function(err, salt) { if (err) return next(err); bcrypt.hash(user.password, salt, null, function(err, hash) { if (err) return next(err); user.password = hash; next(); }); }); }); /* Defining our own custom document instance method */ UserSchema.methods = { comparePassword: function(candidatePassword, cb) { bcrypt.compare(candidatePassword, this.password, function(err, isMatch) { if(err) return cb(err); cb(null, isMatch); }) } }; /** * Statics */ UserSchema.statics = {} module.exports = mongoose.model('User', UserSchema); 

序列化函数确定用户对象中的哪些数据应该存储在会话中。 serializeUser方法的结果作为req.session.passport.user = {}连接到会话,例如它会(因为我们提供id作为键)

  req.session.passport.user = {id:'xyz'} 

Passport将序列化和反序列化来自会话的用户实例。 在这个例子中,只有用户ID被序列化到会话中,保持会话中存储的数据量很小。 当接收到后续请求时,使用该ID查找用户,将其恢复到req.user

序列化和反序列化逻辑由应用程序提供,允许应用程序select适当的数据库和/或对象映射器,而不需要由authentication层进行拼版。 http://passportjs.org/docs

基本上,你需要解决这个问题,在HTML代码中转换这些=或不允许这些符号。 只要记住会话是用&=来转换的。 喜欢 :

 data=data&data2=data2