node-jwt-simple이있는 passport-local


87

성공적인 인증에서 JWT 토큰을 반환하기 위해 passport-local을 결합하려면 어떻게해야합니까?

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?
}

그렇지 않은 경우 토큰을 어떻게 반환 할 수 있습니까?

답변:


123

나는 그것을 알아!

우선 올바른 전략을 구현해야합니다. 제 경우에는 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);
    });
  }
));

제공 한 확인 콜백 function(username, password, done)은 사용자를 찾고 비밀번호가 일치하는지 확인합니다 (질문 및 내 답변의 범위를 벗어남).

passport.js는 작동하기 위해 몇 가지 부분을 기대합니다. 하나는 전략에서 사용자를 반환하는 것입니다. 코드의 해당 부분을 변경하려고했는데 잘못된 것입니다. 콜백 false은 유효성 검사가 실패하면 예상하고 object성공하면 (유효한 사용자)를 예상 합니다 .

이제 .... JWT를 통합하는 방법?

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

(세션을 비활성화하는 것을 기억하십시오. 그렇지 않으면 직렬화 및 직렬화 해제 기능을 구현해야합니다. 세션을 지속하지 않는 경우에는 필요하지 않습니다. 토큰 기반 인증을 사용하는 경우에는 그렇지 않습니다.)

여권-로컬 예에서 : (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을 통해 있어야 함)를 호출 할 때 위의 첫 번째 코드 조각은 제공 한 사용자 이름을 기반으로 사용자를 찾고 암호가 일치하는지 확인합니다 (물론 필요에 맞게 변경하십시오).

그 후 로그인 경로가 호출되고 거기에서 오류 또는 유효한 토큰을 반환 할 수 있습니다.

이것이 누군가를 도울 수 있기를 바랍니다. 실수를했거나 잊은 것이 있으면 알려주세요.


3
Passport의 BasicStrategy 또는 DigestStrategy는 다른 두 가지 옵션입니다. 하지만 기본 전략과 로컬 전략 사이에는 큰 차이가없는 것 같습니다. 세션이 작동 할 필요가 없기 때문입니다. 로컬이 리디렉션 URL을 요청하기 때문입니다 (API 친화적이지 않음).
funseiki

1
안녕하세요 @cgiacomi 토큰을 확인하는 경로의 예를 제공 할 수 있습니까?
Matt Kim

3
안녕하세요 @ matt-kim 저는 토큰을 저장하지 않고 일시적입니다. 이것이 최선의 방법인지 아닌지는 모르겠지만 이것이 제가하는 일입니다. 사용자가 인증하고 토큰을 생성하여 클라이언트에 반환합니다. 클라이언트가 웹 사이트 인 경우 토큰은 localStorage에 저장되거나 iPhone / Android 앱에 저장할 수 있습니다. 클라이언트가 리소스를 요청해야 할 때 저장된 토큰을 백엔드로 보냅니다. Passport가 토큰을 처리합니다. 다음은 토큰을 처리하기위한 Bearer 전략의 요점입니다. gist.github.com/cgiacomi/cd1efa187b8cccbe2a61 이것이 도움이 되기를 바랍니다 ! :)
cgiacomi

1
안녕하세요 @cgiacomi! 당연 할 수도 있지만 사용자 지정 콜백을 사용할 때 세션을 비활성화하는 방법을 설명해 주시겠습니까?
MrMuh

2
@MrMuh 체크 아웃 링크 gist.github.com/cgiacomi/cd1efa187b8cccbe2a61 내 의견에 세션을 비활성화하는 방법을 보여줍니다 : passport.authenticate ( 'bearer', {session : false})
cgiacomi

18

이것은 훌륭한 솔루션입니다. 다음을 추가하고 싶습니다.

var expressJwt = require('express-jwt');

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

저는 "express-jwt" 를 사용하여 토큰을 확인하고 싶습니다 .

btw :이 기사는 Angular를 사용하여 클라이언트 측에서 토큰을 처리하는 방법을 배우는 것이 좋습니다.

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


2
나는 express-jwt인증을 수행하는 데만 사용 했지만.과 같은 다른 패키지의 문서를 읽고 passport-jwt, 나는 express-jwt. 훨씬 간단하고 훨씬 좋네요 IMO
bobbyz

FYI express-jwt는 새로 고침 토큰에 대한 지원을 제공하지 않습니다.
user3344977

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.