2013-11-26 4 views
81

성공적인 인증을 위해 passport-local을 결합하여 JWT 토큰을 반환하려면 어떻게해야합니까?passport-local with node-jwt-simple

node-jwt-simple을 사용하고 passport.js을보고 싶습니다. 어떻게 갈지 잘 모르겠습니다.

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 

passport.use(new LocalStrategy(
    function(username, password, done) { 
    User.findOne({ username: username }, function(err, user) { 
     if (err) { return done(err); } 
     if (!user) { 
     return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
     return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
    } 
)); 

done()을 호출 할 때 토큰을 반환 할 수 있습니까? 이 같은 뭔가 ... (단지 의사 코드)

if(User.validCredentials(username, password)) { 
    var token = jwt.encode({username: username}, tokenSecret); 
    done(null, {token : token}); //is this possible? 
} 

그렇지 않다면, 어떻게 내가 토큰을 반환 할 수 있습니다?

답변

116

나는 그것을 알아 냈다!

먼저 올바른 전략을 구현해야합니다. 내 경우 LocalStrategy에서 유효성 검사 로직을 제공해야합니다. 예를 들어, 여권 - 로컬에있는 것을 사용합시다.

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 

passport.use(new LocalStrategy(
    function(username, password, done) { 
    User.findOne({ username: username }, function(err, user) { 
     if (err) { return done(err); } 
     if (!user) { 
     return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
     return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
    } 
)); 

다시는

passport.js합니다 (질문의 범위와 내 대답을 넘어) 암호 일치가 여러 조각을 기대하는 경우 사용자를 발견하고 확인 처리됩니다 function(username, password, done) 제공하는 확인 전화 작동하려면 전략에서 사용자를 반환해야합니다. 코드의 해당 부분을 변경하려고했는데 잘못되었습니다. 유효성 검사가 실패하면 콜백은 false을, 성공하면 object (유효성이 검사 된 사용자)을 예상합니다.

지금 .... JWT를 통합하는 방법은 무엇입니까?

로그인 경로에서 성공적인 인증 또는 실패한 인증을 처리해야합니다. 그리고 여기에 JWT 토큰 생성을 추가해야합니다. 마찬가지로 :

(세션을 비활성화하는 것을 잊지 마십시오. 그렇지 않으면 serialize 및 deserialize 기능을 구현해야합니다. 세션을 유지하지 않을 경우 필요하지 않습니다. 세션을 유지하지 않을 경우 필요하지 않습니다. 토큰 기반 인증) 여권 로컬 예제

(JWT 토큰)을

// POST /login 
// This is an alternative implementation that uses a custom callback to 
// achieve the same functionality. 
app.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err) } 
    if (!user) { 
     return res.json(401, { error: 'message' }); 
    } 

    //user has authenticated correctly thus we create a JWT token 
    var token = jwt.encode({ username: 'somedata'}, tokenSecret); 
    res.json({ token : token }); 

    })(req, res, next); 
}); 

추가 그게있다! 이제/login 및 POST 사용자 이름과 암호 (항상 SSL을 사용해야 함)를 호출하면 위의 첫 번째 코드 단편은 제공 한 사용자 이름을 기반으로 사용자를 찾은 다음 암호가 일치하는지 확인하려고 시도합니다. 필요에 맞게 변경하십시오.)

로그인 경로가 호출 된 후 오류 또는 유효한 토큰을 반환 할 수 있습니다.

희망이 있으면 도움이 될 것입니다. 그리고 실수를 저 지르거나 뭔가를 잊어 버렸다면 알려주십시오.

+2

쿨, 감사를 다시 보내기 위해, 각도 사용하여 클라이언트 측에서 토큰을 처리하는 방법을 배울 중대하다 그것 : – robertklep

+3

Passport의 [BasicStrategy] (http://passportjs.org/guide/basic-digest/) 또는 DigestStrategy는 다른 두 가지 옵션입니다. 하지만 기본 및 지역 전략 간에는 큰 차이가없는 것 같습니다. 세션이 작동하지 않아도됩니다. 즉, Local에서 리디렉션 URL을 요청 (API 친화력이 약간 떨어짐)하도록 요청하기 때문입니다. – funseiki

+1

안녕하세요 @cgiacomi 토큰을 검사하는 경로의 예를 들려 줄 수 있습니까? –

18

이것은, 난 그냥이 추가 훌륭한 솔루션하고자한다 :

내가 토큰의 유효성을 검사 "표현-JWT"을 를 사용하려면
var expressJwt = require('express-jwt'); 

app.use('/api', expressJwt({secret: secret})); 

.

BTW :이 문서에서는 해결 방법을 게시 할 모든 요청을

https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

+2

나는 'express-jwt'만 사용하여 인증을했지만, 다음과 같은 다른 패키지의 문서를 읽었습니다. 'passport-jwt','express-jwt'를 고수 할 것입니다. 훨씬 더 간단하고 훨씬 좋은 IMO – bobbyz

+0

FYI express-jwt는 새로 고침 토큰을 지원하지 않습니다. – user3344977