2015-02-02 3 views
3

포트 3000 인증에 Passport.js를 사용하는 노드 응용 프로그램을 실행 중입니다. Nginx는 프록시 서버로 사용되어 포트 80에서 수신 대기하고 프록시는 포트 3000에 대한 요청. Passport.js는 사용자의 인증에 사용됩니다.인증 문제 Passport 및 Nginx 프록시 서버로 Node.js

인증 프로토콜은 다음과 같습니다. 사용자가 example.com을 요청하고 로그인하지 않은 경우 example.com/login으로 리디렉션됩니다. 성공적인 로그인 후 사용자는 다시 example.com으로 리디렉션됩니다.

  • 문제

    내가 (고객이 동일한 문제를 가지고로 의심되는) 익스플로러 9 아이 패드 사파리 6을 사용하여 인터넷에 로그인을 시도하고있을 때 발생합니다. 올바른 자격 증명을 사용하는 경우 example.com/ 대신 example.com/login으로 리디렉션됩니다.

  • 예를 들어 크롬 40에서는 문제가 발생하지 않습니다.

  • Safari에서 example.com:3000을 사용하여 nginx를 피할 때 문제가 발생하지 않습니다.
  • 악화시키기 : 때때로 명백한 이유없이 작동합니다.

Nginx와 관련이 있고 파일 요청 순서와 관련이 있다고 생각됩니다.

Nginx의 구성 : 응용 프로그램 코드의

server { 
    listen 80; 
    location/{ 
      proxy_pass http://127.0.0.1:3000; 
    } 
} 

부 : 나는 사람이 나를 도울 수 있는지 궁금

app.post('/api/login', function (req, res, next) { 
passport.authenticate('local-login', function (err, user, info) { 
    if (err) { 
    return next(err); 
    } 
    if (!user) { 
    return res.status(401).send(info); 
    } 
    req.logIn(user, function (err) { 
    if (err) { 
     return next(err); 
    } 
    return res.send({ 
     username: user.username 
    }); 
    }); 
})(req, res, next); 
}); 

app.get('/', isLoggedIn, function (req, res) { 
    res.sendFile(__dirname + '/client/views/index.html'); 
}); 


function isLoggedIn(req, res, next) { 
    if (!req.isAuthenticated()) { 
    res.redirect('/login'); 
    } else { 
    next(); 
    } 
} 

. 필요한 경우 추가 코드 또는 설명을 제공해 드리겠습니다.

답변

6

Nginx는 아무 관련이없는 것으로 나타났습니다. example.com : 3000을 사용하여 직접 액세스하면 가끔씩 문제가 발생합니다.

브라우저에서 한 예로 example.com을 방문 중이며 example.com/login을 표시하고 있다고 나타났습니다. 인터넷에서 어떤 증거도 찾을 수 없지만 Safari/IE9가 리디렉션 된 페이지를 캐싱하고 원본 URL에 링크 된 것으로 의심됩니다. 다음은 어떻게되는지에 대한 이야기입니다.

  1. 사용자는
  2. 이 example.com/login로 리디렉션 가져옵니다 example.com/를 탐색 (브라우저 캐시가 example.com/하지만 로그인 페이지 저장)에
  3. 사용자 로그 및 example.com로 리디렉션됩니다/
  4. 브라우저에 캐시가 있고 로그인 페이지가로드됩니다.
  5. 개발자를위한 설명 할 수없는 버그와 두통.

/요청시 캐시 헤더를 추가하지 않는 미들웨어를 추가하여 '해결'되었습니다.

app.get('/', isLoggedIn, noCache, function (req, res) { 
    res.sendFile(__dirname + '/client/views/index.html'); 
}); 

function noCache(req, res, next) { 
    res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate'); 
    res.header('Expires', '-1'); 
    res.header('Pragma', 'no-cache'); 
    next(); 
} 
+0

공유해 주셔서 감사합니다.;-) – mzalazar

+0

+1은 다른 수정 프로그램이 도움이되지 않는 Internet Explorer의 캐싱 문제를 해결하여 솔루션을 공유해 주신 것을 높이 평가합니다. –