护照本地策略和cURL

我想用CURLtesting我的node.js + express + passport.jstesting应用程序(RESTful)。 我的代码:

var express = require('express'); var routes = require('./routes'); var http = require('http'); var path = require('path'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; // Define the strategy to be used by PassportJS passport.use(new LocalStrategy( function(username, password, done) { if (username === "admin" && password === "admin") // stupid example return done(null, {name: "admin"}); return done(null, false, { message: 'Incorrect username.' }); } )); // Serialized and deserialized methods when got from session passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(user, done) { done(null, user); }); // Define a middleware function to be used for every secured routes var auth = function(req, res, next){ if (!req.isAuthenticated()) res.send(401); else next(); }; var app = express(); // all environments app.set('port', process.env.PORT || 3000); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.json()); app.use(express.urlencoded()); app.use(express.methodOverride()); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); // development only if ('development' == app.get('env')) { app.use(express.errorHandler()); } app.get('/test', auth, function(req, res){ res.send([{name: "user1"}, {name: "user2"}]); }); app.post('/login', passport.authenticate('local'), function(req, res) { res.send(req.user); }); 

调用/testingcurl和

 curl "http://localhost:3000/test" 

返回“未经授权”(迄今为止这是正确的)。

调用/login(POST)curl和

 curl --data "username=admin&password=admin" http://localhost:3000/login 

作品。 但在接下来的请求我的login被“忘记”。 这是因为curl不能处理会话? 有没有解决办法? 我的程序对于REST式应用程序是否正确?

首先,使用curl保存cookies

 curl --cookie-jar jarfile --data "username=admin&password=admin" http://localhost:3000/login 

访问/test时读取存储的cookies:

 curl --cookie jarfile "http://localhost:3000/test" 

在使用Node.js v0.10.26和Express 3.5.0在我的机器(Ubuntu 12.04)上工作之前,需要对应用程序进行一些修改。 我使用express --sessions nodetest生成了一个新的Express应用程序,并编辑了app.js的代码,如下所示。 一旦我安装了依赖关系,我就运行了应用程序,并使用了curl命令。

app.js

 var express = require('express'); var routes = require('./routes'); var user = require('./routes/user'); var http = require('http'); var path = require('path'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var app = express(); // Define the strategy to be used by PassportJS passport.use(new LocalStrategy( function(username, password, done) { if (username === "admin" && password === "admin") // stupid example return done(null, {name: "admin"}); return done(null, false, { message: 'Incorrect username.' }); } )); // Serialized and deserialized methods when got from session passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(user, done) { done(null, user); }); // Define a middleware function to be used for every secured routes var auth = function(req, res, next){ if (!req.isAuthenticated()) res.send(401); else next(); }; // all environments app.set('port', process.env.PORT || 3000); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.json()); app.use(express.urlencoded()); app.use(express.methodOverride()); app.use(express.cookieParser('your secret here')); app.use(express.session()); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); // development only if ('development' == app.get('env')) { app.use(express.errorHandler()); } app.get('/test', auth, function(req, res){ res.send([{name: "user1"}, {name: "user2"}]); }); app.post('/login', passport.authenticate('local'), function(req, res) { res.send(req.user); }); http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); }); 

curl脚本

 #!/bin/sh # curl-login.sh rm jarfile echo --- login curl --cookie-jar jarfile --data "username=admin&password=admin" http://localhost:3000/login echo --- test curl --cookie jarfile "http://localhost:3000/test" 

控制台日志与curl输出

 $ node app & $ sh curl-login.sh --- login POST /login 200 2ms - 21b { "name": "admin" }--- test GET /test 200 1ms - 60b [ { "name": "user1" }, { "name": "user2" } ] 

注意使用

 app.use(express.cookieParser('your secret here')); app.use(express.session()); 

app.js 。 会议没有上述两条线没有工作。

你的问题中的代码也缺乏创buildHTTP服务器的部分,但我认为这只是一个复制粘贴问题; 我指的是

 http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); });