我有以下代码,每次输入 0.0.0.0:3000/user?apikey=xxx
时,本地策略中的代码永远不会运行,它会直接进入“未经授权”页面。我尝试从 server.get('/user')
中删除passport.authenticate。在 Debug模式下,我可以看到“apikey”被解析为请求参数映射。所以这里的问题是 Passport 无法验证 get 请求。任何帮助将不胜感激。谢谢!
var restify = require('restify');
// Create server
var server = restify.createServer({
name: 'server'
});
server.use(restify.queryParser());
server.use(restify.bodyParser());
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
function (apikey, done) {
console.log('Entered authentication.');
done(null, null);
}
));
//specify route
server.get('/user', passport.authenticate('local'), function (req, res) {
console.log(req.params);
res.end('haha');
});
server.listen(3000, function () {
console.log('%s listening at %s', server.name, server.url)
});
最佳答案
LocalStrategy 用于通过用户名和密码对用户进行身份验证。传递的函数需要 3 个参数:用户名、密码和完成的回调。您的函数只需要两个 apikey 即可完成。
此策略不适合您,因为它通过请求中发布的凭据(即从登录页面)对用户进行身份验证,如果您使用 session ,这会很有帮助。另一方面,您必须通过 url 中的 apikey 字符串对每个 GET 请求进行身份验证。因此,您应该编写一个中间件来进行身份验证。
server.use(function(req,res,next){
key=req.query['apikey']; //get key from url
//authenticate it
if(valid(key))
next();
else
res.redirect('/unauthorized');
});
在路由器之前使用它。
关于node.js - restify.js + Passport.js 未验证 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18436162/