【发布时间】:2015-09-10 07:13:16
【问题描述】:
编辑我都尝试了,重定向和不重定向。重定向时,我得到与直接请求 / 相同的结果,当我没有收到时,我收到的是包含 data = Moved Temporarily. Redirecting to / 的对象
鉴于此策略:
var strategy = new LocalStrategy(
{
session: true
},
function (username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (user.password !== password) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
});
还有这台服务器:
//************ EDIT ****//
function genuuid(req) {
return "Test UID";
}
//************ EDIT ****//
var app = express();
var router = express.Router();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(passport.initialize());
//************ EDIT ****//
app.use(session({
genid: function(req) {
return genuuid() // use UUIDs for session IDs
},
secret: "somethingSecret",
cookie: {maxAge: 60000 },
resave: true,
saveUninitialized: false }));
//************ EDIT ****//
passport.use(strategy);
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }));
server = http.createServer(app).listen(port, function(){
console.log('Express server listening on port ' + app.get('port'));
})
我正在尝试从我的客户端(摩卡测试)获取生成的令牌,如下所示:
it('Login should redirect to home and return a user token', function(done) {
var postData = querystring.stringify({
username : user,
password : password
});
var options = {
uri: 'http://' + hostname + ':' + port + '/login',
followRedirect: false
};
request.post(options)
.form(postData)
.on('response', function(res) {
res.statusCode.should.equal(302);
})
.on('data',function(data) {
should.exist(data);
should.fail(0,1,'Test not implemented');
done();
})
.on('error', function(e) {
should.fail(0,1,'Problem with request: ' + e.message);
});
});
标题包含
{ 'x-powered-by': 'Express',
location: '/',
vary: 'Accept',
'content-type': 'text/plain; charset=utf-8',
'content-length': '35',
date: 'Tue, 08 Sep 2015 19:46:03 GMT',
connection: 'keep-alive' }
没有 cookie 之类的。我的令牌呢?
【问题讨论】:
-
你有
passport.serialize和passport.deserialize函数吗? -
我愿意
passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(user, done) { done(null, user); }); -
嗯。在Passport docs(搜索“deserializeUser”)中,
deserializeUser函数似乎将用户从数据库中拉出并返回该对象,而不是调用done,这可能是相关的 -
此外,它使用特定字段来序列化用户而不是整个对象:
passport.serializeUser(function(user, done) { done(null, user.id); });请注意,user.id 用于done的第二个参数.在您的情况下,您可能会使用user.username -
刚刚注意到,这一行:
if (!user.password === password)将始终评估为 false;改为使用if (user.password !== password)
标签: node.js passport.js passport-local