본문 바로가기
개발

[NodeJS] Passport - local/strategy 콜백완성

by 마스터누누 2017. 4. 18.
728x90
반응형

 Passport - local/strategy 콜백완성



에러처리

(아이디가 중복되는 상황)


1
2
3
4
5
6
7
8
9
passport.use('local-join'new LocalStrategy({
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true
  }, function(req, email, password, done){                                                             
    // 콜백 함수 내용 완성
  }
));
 
cs


post 요청이들어오면 passport가 실행되며, 

passport내부 콜백 함수로 인증 절차가 진행된다.

콜백 함수 내용 완성이라고 주석 처리 된 부분에 데이터값을 받아와서

인증하는 루틴을 완성해보자




1
2
3
4
5
6
7
8
9
10
var query = connection.query('select * from user where email = ?', [email], function(err, rows){
      if(err) return done(err);
      if(rows.length){
        console.log('exist user');
        return done(nullfalse,{message: 'your email is already used'})
      }else{
 
      }
    })
 
cs


우선 다음과 같은 소스코드까지 완성한다

이 코드는 데이터베이스에 접근하여 중복된 값이 있으면 

콘솔에 에러메세지를 출력하는 코드이다.

여기까지 작성 후 브라우저를 통해 제대로 동작하는지 확인해본다.




 


현재 데이터베이스의 user 테이블은 다음과 같고,  브라우저를 통해 이미 테이블에 있는 값을 입력하면, 콘솔에는 exist user 경고를 출력한다.

그 결과 passport.authenticate함수의 리다이렉트로 인해

인증은 실패하고 /Join으로 이동하게 된다.




1
2
3
4
5
6
7
router.get('/'function(req, res){
  var msg;
  var errMsg = req.flush('error');
  if(errMsg) msg = errMsg;
  res.render('join.ejs', {'message' : msg});                                                               
})
 
cs


리다이렉트의 확인을 위해 메세지를 사용할 필요성이 있다.

따라서 get 요청이 들어왔을때 오류가 있다면 메세지를 출력하도록하자

위의 코드는 req의 flash로 넘어오는 메세지를 출력하게 한다.




1
<section class="message"><%=message%></section>                                                             
cs


ejs에 메세지를 받을 section도 추가해 주자

res.render에서 'message' : msg를 통해 넘어오는 값을 랜더링한다.






메일이 데이터베이스에서 중복될 경우 다음과 같은 메세지가 뜬다.




1
return done(nullfalse,{message: 'your email is already used'})                                         
cs


여기서 발생하는 메세지는 passport.use의 콜백함수 err처리 안에서

done내부에서 지정된 메세지가 리턴되면서 발생한다.

다른 메세지를 출력하고 싶은경우 done내부의 메세지를 수정하면 된다.




정상적인 접근에 대한 처리


1
2
3
4
5
6
var sql = {email:email, pw:password}
        var query = connection.query('insert into user set ?', sql, function(err,rows){
          if(err) throw error;
          return done(null, {'email':email,'id' :rows.insertId})
        })
 
cs


다음과 같은 코드를 콜백함수 내부 else문 안에 넣어준다.

(if문은 에러에 대한 처리, else는 정상 접근에 대한 처리)

데이터베이스에 값을 입력하는 코드이다.


그러나 이 코드를 입력하는 것 만으로 데이터가 처리되지 않는다

done함수를 사용할 경우 serialize를 해줘야하는데

아직 처리가 되지 않았으므로 데이터가 저장되지 않는것이다.

그렇다면 계속해서 serialize로 세션 처리를 해주도록 하자




예제코드



반응형

댓글