Node.js restify.js+;passport.js未验证GET请求

Node.js restify.js+;passport.js未验证GET请求,node.js,restify,passport.js,Node.js,Restify,Passport.js,我有以下代码,每次我输入0.0.0.0:3000/user?apikey=xxx,本地策略中的代码永远不会运行,它直接进入“未经授权”页面。我试图从服务器上删除passport.authenticate.get('/user')。在调试模式下,我可以看到'apikey'被解析为请求参数映射。所以这里的问题是passport无法对get请求进行身份验证。任何帮助都将不胜感激。谢谢 var restify = require('restify'); // Create server var serv

我有以下代码,每次我输入
0.0.0.0:3000/user?apikey=xxx
,本地策略中的代码永远不会运行,它直接进入“未经授权”页面。我试图从
服务器上删除passport.authenticate.get('/user')
。在调试模式下,我可以看到'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个参数:用户名、密码和回调完成。您的函数只需要两个键就可以完成

此策略不适合您,因为它通过请求中发布的凭据(即从登录页面)对用户进行身份验证,如果您正在使用会话,这将非常有用。另一方面,您必须通过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');
});

在路由器之前使用此选项。

本地策略用于通过用户名和密码验证用户。传递的函数需要3个参数:用户名、密码和回调完成。您的函数只需要两个键就可以完成

此策略不适合您,因为它通过请求中发布的凭据(即从登录页面)对用户进行身份验证,如果您正在使用会话,这将非常有用。另一方面,您必须通过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');
});

在路由器之前使用此选项。

另一种方法是只使用HTTP基本身份验证。这样,用户ID/密码将在授权头中发送,而不是URI的一部分,因为这是保护服务的一种相当常见的方法(请确保通过HTTPS执行此操作)。我写这个小模块就是为了做这个,部分借用了一些例子


另一种方法是简单地使用HTTP基本身份验证。这样,用户ID/密码将在授权头中发送,而不是URI的一部分,因为这是保护服务的一种相当常见的方法(请确保通过HTTPS执行此操作)。我写这个小模块就是为了做这个,部分借用了一些例子


我想将身份验证添加到我的RESTAPI中。我在寻找解决方案(令牌服务器、openid、passport.js等),没有一个是简单的、可访问的,对我来说还可以。我对节点中间件的无知是有罪的。您的解决方案非常简单和易于访问,谢谢。如果URL中的密钥不易受中间人攻击的影响?是否需要SSL?我想将身份验证添加到我的REST API中。我在寻找解决方案(令牌服务器、openid、passport.js等),没有一个是简单的、可访问的,对我来说还可以。我对节点中间件的无知是有罪的。您的解决方案非常简单和易于访问,谢谢。如果URL中的密钥不易受中间人攻击的影响?是否需要SSL?
var basicAuth = require(__dirname + '/../utils/authn.js');
exports.count = function (req, res, next) {
    basicAuth.authenticate(req, res, next, function() {
        validateParam(req.params.uid, next);
        var url = '/count/' + encodeURIComponent(req.params.uid);

        processRequest(req, res, next, url);
    });
};