2014-06-18 4 views
3

Passport를 사용하여 응용 프로그램에서 다이제스트 인증을 구현하려고하는데 다음 문제가 발생하여 해결 방법을 찾을 수 없습니다.다이제스트 인증에 대한 잘못된 요청 (사용자 : false)

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

당신은 마지막에 완벽한 컬 요청/응답을 찾을 수 있습니다 : 잘못된 요청 응답 - 다음과 같이 내 "보호 된 URL을"곱슬 곱슬

, 나는 400을 얻는다.

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.authenticate에 대한 사용자 정의 콜백을 사용하려고했습니다 왜 제대로 구출되지는 못했지만 그 이유를 알 수는 없습니다.

나는 다음과 같이 다이제스트 인증을 사용하는 여권 구성한

: I 옵션을 기본 살고 있고 왼쪽으로 모든 것을 시도했습니다

  • 를, 그래서 넌스 및 영역 매개 변수는
  • 샘플 outpout 여권으로 잘 살고있다 서로 다른 시간대에 촬영 되었기 때문에 nonce 값이 동일하지 않습니다.
  • 전략을 '기본'으로 변경하면 효과가 있습니다.

하는 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 - 잘못된 요청"받을 응답을 .

-v 옵션을 사용하여 curl 명령의 전체 출력을 남겼습니다.

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% 

답변

5

비슷한 문제가 발생하여 두 경우 모두 passport-http가 탑재 된 응용 프로그램에서 작동하지 않는다고 생각됩니다.

CI 빌드를 통과 할 수있는 경우 버그를 수정할 수있는 열린 풀 요청 (https://github.com/jaredhanson/passport-http/pull/16)이 있습니다.

해결 방법은 Express 라우터 인스턴스를 제거하고 앱 인스턴스를 전달하여 모든 엔드 포인트를 앱 객체에 직접 마운트하는 것입니다.

+0

방금이 문제가 발생했습니다. 수동으로 수정해야하는 경우 node_modules 폴더에서 passport-http를 입력하십시오. digest.js의 115 행을'if (req.url! == creds.uri) {'에서'var url = req.originalUrl || req.url; if (url! == creds.uri) {' –

관련 문제