2013-10-24 3 views
6

지난 며칠 동안 Passport.js를 사용하여 나의 첫 사용자 로그인 & 인증 시스템을 개발했습니다. 난처하게 충분히, 나는 그것을 완료하고 그것은 의도 한대로 작동합니다. 문제는 비록 많은 기사를 읽고 온라인으로 수십 가지 예제를 확인했지만 코드 자체를 완전히 이해하지 못하는 것 같습니다. 나는 그 뒤에있는 과정을 이해하고 왜 그런 일이 일어나야하는지에 대해 아무런 이슈도 없다. 나를위한 코드의 일부를 명확히 할 수 있다면 정말 고맙겠습니다. (- 몽구스 모델 사용자)Passport.js 사용자 로그인 및 인증

// Passport session setup 
passport.serializeUser(function (user, done) { 
    done(null, user._id); 
}); 

passport.deserializeUser(function (id, done) { 
    User.findById(id, function(err, user) { 
     done(err, user); 
    }); 
}); 

// Use the Local Strategy within passport 
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: 'Unknown user: ' + username}); 
     } 

     user.comparePassword(password, function(err, isMatch) { 
      if (err) { 
       return done(err); 
      } 

      if (isMatch) { 
       return done(null, user); 
      } else { 
       return done(null, false, { message: 'Invalid Password' }); 
      } 
     }); 
    }); 
})); 

var app = module.exports = express(); 

app.configure(function() { 
    app.set('views', path.join(__dirname + '/views')); 
    app.set('view engine', 'html'); 
    app.engine('html', hbs.__express); 
    app.use(express.logger()); 
    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.session({ secret: 'xxx' }));  
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(path.join(__dirname + '/public'))); 

}); 

내가 MongoDB를 사용하고 있습니다 : 이것은 내 app.js 파일에 저장된 작업 코드입니다. 또한 데이터베이스에 비밀번호를 저장하기 위해 현재 bcrypt를 사용하고 있습니다.

여기서 가장 이해할 수없는 부분은 입니다. 콜백 기능을 수행했습니다. 나는 그것이 단순히 일부 값을 전달한다는 것을 이해할 수 있으며, 그 첫 번째 매개 변수가 오류이고 두 번째 매개 변수가 데이터라는 사실을 깨닫는다. 하지만 매개 변수로 제공하지 않았기 때문에 아직 완전히 파악하지 못했습니다.

// Random Function 
var randomFunction = function (a, b, done) { 
    done(a, b); 
}; 

// Then I would call the randomFunction providing my own **done** 
randomFunction('Random', 'Words', function(a, b) { return a + b; }); 

하지만 내 예제에서 나는 수행 콜백을 지정하는 일 아니다 예를 들어,이 같은 기능을했을 경우. 그것은 요구 콜백 함수 파라미터는 단순히거나 같은 통상의 미들웨어에서 다음 기능과 동일하다 :

는 또한
function middleware (req, res, next) { 
    next(req.user); // pass the req.user to next middleware 
} 

여기서 Passport.js 그것을 취급하는 사용자를 결합 하는가? 그것은 그것을 req.user에 바인딩합니까? 그리고 예를 들어 사용자 이름을 표시하기 위해 특정보기에 순서를 전달하려면 어떻게해야합니까?

귀하의 의견을 기다리고 있습니다!

감사합니다. Local Strategy의 코드에서

답변

3

완료 콜백

봐 :

function Strategy(options, verify) { 
    ... 
    this._verify = verify; 
    ... 
} 

verify는 사용자를 확인하는 전략으로 사용되는 기능이며, 당신은 여기를 지정한 :

passport.use(new LocalStrategy(function (username, password, done) { 
    // your verification code here 
})); 

전략의 나중에 당신은 authenticate 메서드를 호출하여 확인할 수 있습니다. username, passworddone==verified 어디에서 온

this._verify(username, password, verified); 

그래서, 당신은 지금 참조 : 위의 단계에서. 나중에 코드에서 (err, user, info) 인수를 사용하여 done 콜백을 호출합니다. 즉, 사용자 확인의 비동기 절차를 완료하려면 done이 필요합니다.

req.user 및 전망

, 당신은 권리에 대한 req.user 있습니다.그래서 당신은 두 가지 방법으로 귀하의 의견에 전달할 수 있습니다

  1. res.render 함수의 인수로. See docs

    res.render('some-template', { name: req.user }); 
    
  2. 사용 res.locals 컨텍스트 공급자의 일종으로 (이제 사용자 개체가 app.router에 정의 된 모든 뷰에서 사용할 수 있습니다). See docs

+0

// before app.use(app.router); app.use(function(req, res, next) { res.locals.user = req.user; next(); }); 
귀하의 의견 주셔서 너무 감사합니다! 필자가 이해 하듯이 done은 미들웨어에서 정보를 반환하는 데 사용되는 콜백 함수입니다. 정보로는 3 개의 매개 변수 (오류, 사용자, 정보)를 의미합니다. 기본적으로, 완료된 콜백을 특정 미들웨어의 반환이라고 (상위 수준에서) 간주 할 수 있습니까? –

+1

내가 올바른 방법으로 질문을 이해한다면, 그렇지 않습니다. 'done'은 일부 데이터를 다음 레벨로 제공하는 용도로만 사용됩니다. 당신의 인증 코드는'done()'을 호출 한 후 정상적인 방법으로 실행됩니다. 그래서 당신은'return done (err);'을 사용하여 당신이 인증 코드의 실행을 멈추게해야합니다. 그것은 비동기적인 것들을위한 일반적인 경우입니다. –

+0

그게 내가 의미하는 것 ^^ 나는 내 대답에서 다소 모호한 것 같아. :) 고마워, 너의 의견을 많이 주셔서 감사합니다. 정말 고마워요! –

관련 문제