无法将用户加载到会话中
由于某种原因,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
- 在node.js中使用socket.io共享协作工作的url
- mongoose是虚拟的吗?
- Express和Passport错误:未知的身份validation策略“login”
- 将Javascript从节点快递发送到angular度服务
- Javascript和Mongoose for-loop在执行.find之前完成
- 在Jade视图中使用JavaScript代码 – 如果(variables)显示未定义,而不是传递
- 设置一个句柄帮助器,以快速返回每个请求的特定值
- 如何在一个快速/mongoose应用程序中正确地构造数据库调用?
- POST net :: ERR_INSUFFICIENT_RESOURCES,同时使用nodeJS上传多个图像