【问题标题】:restify.js + passport.js not authenticating GET requestrestify.js + passport.js 不验证 GET 请求
【发布时间】:2013-08-28 11:20:34
【问题描述】:

我有以下代码,每次输入0.0.0.0:3000/user?apikey=xxx,本地策略中的代码永远不会运行,它直接进入“未授权”页面。我试图从server.get('/user') 中删除 passport.authenticate。在调试模式下,我可以看到“apikey”被解析为请求参数映射。所以这里的问题是护照无法验证获取请求。任何帮助将不胜感激。谢谢!

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)
});

【问题讨论】:

    标签: node.js restify passport.js


    【解决方案1】:

    LocalStrategy 用于通过用户名和密码对用户进行身份验证。传递的函数需要 3 个参数:用户名、密码和完成的回调。您的函数只需要两个 apikey 即可完成。

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

    在路由器之前使用它。

    【讨论】:

    • 我想向我的 REST API 添加身份验证。我一直在寻找解决方案(令牌服务器、openid、passport.js 等),没有一个是简单的、可访问的,对我来说还可以。我对节点中间件的无知是有罪的。您的解决方案非常简单易用,谢谢。
    • 使用 url 中的密钥,这不会容易受到中间人的攻击吗?不需要 SSL 吗?
    【解决方案2】:

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

    var restify = require('restify'),
        userId = process.env.serviceID,
        pwd = process.env.servicePassword,
        passport = require('passport'),
        BasicStrategy = require('passport-http').BasicStrategy;
    
    passport.use(new BasicStrategy(
        function (username, password, done) {
            findByUsername(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);
            });
        }
    ));
    
    var users = [
        { id: 1, username: userId, password: pwd}
    ];
    
    function findByUsername(username, fn) {
        for (var i = 0, len = users.length; i < len; i++) {
            var user = users[i];
            if (user.username === username) {
                return fn(null, user);
            }
        }
        return fn(null, null);
    }
    
    exports.authenticate = function (req, res, next, callback) {
        passport.authenticate('basic', function (err, user) {
            if (err) {
                console.log(err);
                return next(err);
            }
            if (!user) {
                var error = new restify.InvalidCredentialsError("Failed to authenticate to ma-services.");
                console.log(error);
                res.send(error);
                return next();
            }
    
            callback(req, res, next);
        })(req, res, next);
    };
    

    要调用它,我只需从服务器将调用的导出 API 调用中执行以下操作:

    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);
        });
    };
    

    【讨论】:

      猜你喜欢
      • 2020-02-08
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 2017-12-06
      • 1970-01-01
      • 2021-12-03
      • 2019-04-12
      相关资源
      最近更新 更多