2014-06-18 2 views
3

J'essaie d'implémenter l'authentification Digest dans mon application en utilisant Passport, mais j'ai rencontré le problème suivant et je n'arrive pas à comprendre comment le résoudre.Mauvaise demande sur l'authentification digest (User: false)

Quand je recroqueville mon « url protégée » comme suit, je reçois 400 - Bad réponse à la demande:

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

Vous pouvez trouver la demande de boucle complète/réponse à la fin.

J'ai essayé d'utiliser un rappel personnalisé pour passport.authenticate afin de voir ce qui est il devient:

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

Et le résultat a été:

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

Je pense donc que l'utilisateur est ne pas être envoyé correctement, mais ne peut pas comprendre pourquoi.

J'ai configuré passeport pour utiliser l'authentification Digest comme suit:

  • J'ai essayé de tout reste setted par défaut des options, de sorte que les paramètres et de royaume sont nonce setted par passeport
  • Les échantillons outpout ont été prises à des moments différents, c'est pourquoi la valeur de nonce n'est pas la même.
  • Si je change la stratégie en 'basique' cela fonctionne.

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

Puis, quand je tente:

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

je reçois un "400 - Demande incorrecte" réponse .

J'ai laissé une sortie complète de la commande curl avec l'option -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% 

Répondre

5

j'ai rencontré un problème similaire et croient, dans nos deux cas, le problème est que le passeport-http ne fonctionne pas avec les applications montées.

Il existe une demande d'extraction ouverte, https://github.com/jaredhanson/passport-http/pull/16, qui peut corriger le bogue s'il est possible de passer la construction CI. Une solution consiste à simplement supprimer les instances de routeur Express et à passer l'instance de l'application pour monter tous les points de terminaison directement sur l'objet app.

+0

Je viens de rencontrer ce problème. Si vous avez besoin de corriger manuellement, dans votre dossier node_modules pour passport-http. Changez la ligne 115 de digest.js de 'if (req.url! == creds.uri) {' à var url = req.originalUrl || req.url; if (url! == creds.uri) {' –