2015-01-21 3 views
0

익스프레스를 3.x에서 4.x로 마이그레이션 중이며 익스프레스 4에는 basicAuth이 없으므로 이것을 basic-auth module으로 바꾸려고합니다.익스프레스 "BasicAuth"와 자격 증명 비동기 확인

문제는 내 user_tools.checkCredentials() 방법을 통해 자격 증명을 비동기로 확인하는 것입니다. 자동 CHECKCREDENTIALS에 실패,

var auth = function(req, res, next) { 
    isFromLAN(req.ip, function(fromLAN) { 
    if (fromLAN) { 
     // console.log('LAN --> no auth needed'); 
     next(); 
    } else { 
     // console.log(req.ip + ' --> WAN --> auth to pass'); 
     basicAuth(function(user, pass, callback) { 
     user_tools.checkCredentials(user, pass, function(valid) { 
     callback(null, valid); 
     }); 
     })(req, res, next); 
    } 
    }); 
}; 

현재 코드 : 연결 BASICAUTH 미들웨어에서

var express = require('express'); 
var basicAuth = require('basic-auth'); 
var user_tools = require('./user-tools'); 

var app = express(); 

var auth = function(req, res, next) { 
    function isFromLAN(ip) { 
    console.log('isFromLAN()', ip); 
    if (ip === '127.0.0.1') { 
     return true; 
    } 
    return false; 
    } 

    if (isFromLAN(req.ip)) { 
    // console.log('LAN --> no auth needed'); 
    next(); 
    } else { 
    console.log(req.ip + ' --> WAN --> auth to pass'); 

    function unauthorized(res) { 
     console.log('unauthorized --> 401'); 
     res.set('WWW-Authenticate', 'Basic realm=Authorization Required'); 
     return res.sendStatus(401); 
    } 

    var user = basicAuth(req); 
    console.log('basicAuth user:', user); 

    if (!user || !user.name || !user.pass) { 
     console.log('!user'); 
     return unauthorized(res); 
    } 

    user_tools.checkCredentials(user.name, user.pass, function(valid) { 
     console.log('valid:', valid); 
     if (valid) { 
     return next(); 
     } else { 
     return unauthorized(res); 
     } 
    }); 
    } 
}; 

app.get('/restricted_api/:value', auth, function(req, res) { 
    // do authorised stuff 
}); 

답변

0

문제는1 분이 걸리고 요청을 끝내도록 유도했습니다.

더 작은 rounds 값 (시드를 위해 암호를 해싱 할 때)을 사용하면 compare 작업의 응답 시간이 훨씬 빨라졌습니다.

FYI는 암호를 rounds (10 -> 2^10 라운드)의 기본값을 사용하여 시드와 함께 생성 된 해시와 비교할 때 내 라즈베리 파이에서 1 분이 걸렸습니다. 반면에, 비밀 번호 5 (2^5) rounds와 씨앗과 함께 해시 compare() 응답을 준 1 초.

0

(http://www.senchalabs.org/connect/basicAuth.html), req.user는 그것을 는 3.x를 함께을 어떻게 작동하는지

입니다 세트. express 4 버전에서는 그 부분을 찾을 수 없습니다. 함수 (req, res)에 req.user가 필요하기 때문에 그 원인이 불확실한 지 잘 모르겠습니다.

+0

아니, 나는 그렇지 않다. 'req.user = user; '를 추가했지만 실제 문제는 비동기식 finance'checkCredentials() 전에 미안할 때'auth()'미들웨어가 종료 될 때 console.log ('valid : ', valid))'반환합니다. Express 3.x에는 내가 가지고 있지 않은 비동기 요청에 대해'var pause = utils.pause (req); '라는 링크가있는 미들웨어가 있습니다. – Saran

+1

그건 내가 눈치 챘을 한 가지였습니다. 한 번의 인증 기능에서 일시 중지를 사용하여 인증하는 동안 요청의 데이터/이벤트를 캡처 한 다음 해당 데이터/이벤트를 릴리스했습니다. 자세한 내용은 다음을 참조하십시오 (http://stackoverflow.com/questions/13412157/how-to-avoid-the-data-of-request-stream-loss-after-doing-some-authentication-on). 요청 본문/파일을 보내야하는 경우 일시 중지가 필요합니다. 당신이 진짜 문제를 발견 한 것 같습니다. – dliu