#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) {