Неверный запрос на дайджест-аутентификацию (пользователь: false)

#node.js #express #passport.js

#node.js #экспресс #passport.js

Вопрос:

Я пытаюсь реализовать дайджест-аутентификацию в своем приложении, используя Passport, но я столкнулся со следующей проблемой и не могу понять, как ее решить.

Когда я скручиваю свой «защищенный URL» следующим образом, я получаю 400-неверный ответ на запрос:

     $curl --user test:123456 --digest http://localhost:3000/users
  

Вы можете найти полный запрос / ответ curl в конце.

Я пытался использовать пользовательский обратный passport.authenticate вызов, чтобы посмотреть, что он получает:

 users.get('/', function(req, res, next) {
  passport.authenticate('digest', {session: false}, function(err, user, info) {
  console.log('Err: %s', err);
  console.log('User: %s', user);
  console.log('Info: %s', info);
})(req, res, next);
}, otherMiddleware);
  

И результат был:

 Err: null
User: false
Info: Digest realm="Users", nonce="YTFqg2z17mYU039DvuLzONN48F0q1Xmk", qop="auth"
  

Поэтому я думаю, что пользователь отправляется неправильно, но не могу понять, почему.

Я настроил passport на использование дайджест-аутентификации следующим образом:

  • Я попытался оставить все настроенным на параметры по умолчанию, поэтому параметры одноразового номера и области устанавливаются по паспорту
  • Исходящие выборки были взяты в разное время, поэтому значение одноразового номера не совпадает.
  • Если я изменю стратегию на «базовую», она просто сработает.

index.js:

 // ...
var passport = require('passport);
var usersRoute = require('./routes/users');

// ...

app.use(passport.initialize());
app.use('/users', usersRoute);
  

users.js

 var passport = require('passport'),
  DigestStrategy = require('passport-http').DigestStrategy,
  User = require('../../models/users');


passport.use(new DigestStrategy({qop: 'auth'},function(username, done) {
  User.findOne({username: username}, function (err, user) {
    if (err) {return done(err);}
    if (!user) {return done(null, false);}
    return done(null, user, user.password);
  });
}));

users.get('/', passport.authenticate('digest', {session: false}), function(req, res) {
  res.send('Hi!');
});
  

Затем, когда я пытаюсь:

 $curl --user test:123456 --digest http://localhost:3000/users
  

Я получаю ответ «400 — неверный запрос».

Я оставил полный вывод команды curl с параметром -v.

     Eileen :: ~ » curl -v --user test:123456 --digest http://localhost:3000/users
    * Adding handle: conn: 0x7f858b803a00
    * Adding handle: send: 0
    * Adding handle: recv: 0
    * Curl_addHandleToPipeline: length: 1
    * - Conn 0 (0x7f858b803a00) send_pipe: 1, recv_pipe: 0
    * About to connect() to localhost port 3000 (#0)
    *   Trying ::1...
    *   Trying 127.0.0.1...
    * Connected to localhost (127.0.0.1) port 3000 (#0)
    * Server auth using Digest with user 'test'
    > GET /users HTTP/1.1
    > User-Agent: curl/7.30.0
    > Host: localhost:3000
    > Accept: */*
    >
    < HTTP/1.1 401 Unauthorized
    < X-Powered-By: Express
    < WWW-Authenticate: Digest realm="Users", nonce="Ah0vZigHMrDx6SMcA3cMeaFm46RtYmv9", qop="auth"
    < Date: Wed, 18 Jun 2014 11:13:58 GMT
    < Connection: keep-alive
    < Transfer-Encoding: chunked
    <
    * Ignoring the response-body
    * Connection #0 to host localhost left intact
    * Issue another request to this URL: 'http://localhost:3000/users'
    * Found bundle for host localhost: 0x7f858b4151c0
    * Re-using existing connection! (#0) with host localhost
    * Connected to localhost (127.0.0.1) port 3000 (#0)
    * Adding handle: conn: 0x7f858b803a00
    * Adding handle: send: 0
    * Adding handle: recv: 0
    * Curl_addHandleToPipeline: length: 1
    * - Conn 0 (0x7f858b803a00) send_pipe: 1, recv_pipe: 0
    * Server auth using Digest with user 'test'
    > GET /users HTTP/1.1
    > Authorization: Digest username="test", realm="Users", nonce="Ah0vZigHMrDx6SMcA3cMeaFm46RtYmv9", uri="/users", cnonce="ICAgICAgICAgICAgICAgICAgICAgIDE0MDMyNjc5MTY=", nc=00000001, qop=auth, response="7c7d3c5bb1b8882915d3ffe1a2b0231c"
    > User-Agent: curl/7.30.0
    > Host: localhost:3000
    > Accept: */*
    >
    < HTTP/1.1 400 Bad Request
    < X-Powered-By: Express
    < Date: Wed, 18 Jun 2014 11:13:58 GMT
    < Connection: keep-alive
    < Transfer-Encoding: chunked
    <
    * Connection #0 to host localhost left intact
    Bad Request%
  

Ответ №1:

Я столкнулся с аналогичной проблемой и считаю, что в обоих наших случаях проблема в том, что passport-http не работает с подключенными приложениями.

Существует открытый запрос на извлечение, https://github.com/jaredhanson/passport-http/pull/16 , это может исправить ошибку, если ее можно заставить пройти сборку CI.

Обходной путь — просто удалить экземпляры Express router и передать экземпляр приложения для подключения всех конечных точек непосредственно к объекту приложения.

Комментарии:

1. Я только что столкнулся с этой самой проблемой. Если вам нужно исправить вручную, в вашей папке node_modules для passport-http. Измените строку 115 из digest.js от if (req.url !== creds.uri) { до var url = req.originalUrl || req.url; if (url !== creds.uri) {