Возникли проблемы с интеграцией Passport-local с Restify

Мое примерное приложение выглядит следующим образом

var util = require("util")
restify = require("restify"),
    q = require("q"),
    _ = require("lodash");

//Create Server
var server = restify.createServer({
    name: "TestAuth"
});
server.use(restify.queryParser());
server.use(restify.bodyParser());

//Initialize Passport
var passport = require("passport"),
    LocalStrategy = require("passport-local").Strategy;

server.use(passport.initialize());

passport.use(new LocalStrategy(
    function(username, password, done) {
       return done(null, "Test")
    }));

//Session setup

server.post("/login", function(req, res, next) {
    passport.authenticate("local", function(err, user, info) {
        console.log(util.format("%s is logged in!", user))

        res.send(200);
        return next();
    })(req, res, next);
});

server.listen(8080);

Когда я делаю запрос /login?username=test&password=test, он вызывает обратный вызов аутентификации, но «пользователь» имеет значение false. Когда я просто использую

server.post("/login", passport.authenticate("local");

Я получаю ответ Bad Request от restify.


person indigo0086    schedule 09.04.2014    source источник


Ответы (1)


На этой странице паспортной документации в разделе "Пользовательский обратный вызов" внизу показано, что для пути вы используете паспорт в своем основном фрагменте, метод запроса должен быть «получить», а не «пост». Я копирую сюда фрагмент кода с этой страницы:

app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
});

На этой странице есть другие примеры того, как можно использовать паспорт, включая «местный» вариант, который вы пытались использовать.

person cybersam    schedule 09.04.2014
comment
Причина, по которой я использую сообщение, заключается в том, что я намерен использовать запрос аутентификации в качестве изменения для создания и хранения ключа аутентификации. В других примерах разрешены сообщения, которые я изо всех сил старался скопировать. Я действительно изменил его на get, и это сработало. Теперь мне интересно, должен ли генератор ключа авторизации быть привязан к логину, или клиент должен совершить еще одну поездку на сервер после подтверждения входа в систему, а также сгенерировать и получить ключ авторизации? - person indigo0086; 10.04.2014
comment
Я предполагаю, что моя проблема, похоже, заключалась в клиенте Webstorm REST. По какой-то причине он не передавался в параметрах запроса. Если я использую почтальона или скрипача, он отлично работает. - person indigo0086; 11.04.2014