我发现以下关于deserializeUser应如何工作的帖子:PassportJS serializeUser and deserializeUser execution flow
但是当我尝试将JSON发送到包含用户密钥的服务器时,我无法调用req.user来查找用户的详细信息。
我不确定如何查看正在发生的事情,因为很多内容正在进行中。
护照是否期望我发送包含密钥的cookie? cookie或格式的任何特定名称? 是否需要我以JSON格式发送密钥?
const express = require('express')
const app = express()
const mongoose = require('mongoose')
var cors = require('cors')
const bodyParser = require('body-parser')
var http = require('http')
var cookieParser = require('cookie-parser');
app.use(cookieParser('someSecret'));
var session = require('express-session');
app.use(session());
var flash=require("connect-flash");
app.use(flash());
passport.use(new LocalStrategy({
usernameField: 'username',
passwordField: 'password',
session: true,
passReqToCallback: true
},
function(req, username, password, done){
registrationModel.findOne({username: username}, function(err, user){
if (err) { return done(err); }
if (!user){
console.log("Username incorrect")
return done(null, false, { message: 'Incorrect username.'});
}
if (user.password != password){
console.log("Password Incorrect")
return done(null, false, { message: 'Incorrect Password.'});
} else {
console.log("Returning good stuff")
console.log(user)
return done(null, user);
}
});
}
));
//Needed for authenticating the session and initializing passport
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user, done) {
console.log("Serializing User")
console.log(user.id)
console.log("Should be serialized")
done(null, user.id);
});
passport.deserializeUser(function(id, done){
users.User.findById(id, function(err, User) {
console.log('attempting to deserialize user')
console.log(user)
console.log('--------------')
if (User){
done(err, User);
} else {
done(err, null);
}
})
})
app.post('/api/authenticate', passport.authenticate('local'),
function(req, res){
const individualIWant = jsonQuery('req.sessionStore.sessions')
res.cookie('FreeUp', req.session.passport.user)
var cookie = JSON.stringify(req.session.passport.user)
res.send({'name': 'FreeUp', 'value': cookie})
})
我可以在浏览器中看到一个cookie: 名:" FreeUp" 值:"" 59c4cf4ecb364a000f23a707""
该值是对象的数据库ID,而不是序列化对象的键。我知道我需要使用res.req.sessionID来访问序列化对象的密钥,然后将其发回。
然而,这一点仍然存在,我不知道是否将其作为json文件或cookie发回。它看起来像是一个复杂的库。
从Ember发回数据时,护照希望我使用哪种格式?
谢谢!
答案 0 :(得分:0)
我也遇到了很多麻烦。
据我所知,Passport实际上并没有创建会话。所以你需要使用另一个中间件,比如快速会话,你还需要一个cookie解析器。
我使用他们在Scotch上的教程构建了我的身份验证:https://scotch.io/tutorials/easy-node-authentication-setup-and-local。它是非常好的评论和我能找到的唯一直接的教程(特别是对于本地身份验证)。我可以验证它对我有用,当我在路由中传递时,req.user正在存储所有凭据。
希望有所帮助。