페이스북을 통해 로그인을 하면 페이스북으로 다이렉트해주고, '계속' 진행하면 페이스북은 웹 어플리케이션으로 다시 리다이렉트한다. 이 때 웹 어플리케이션으로 리다이렉트할 때 사용자의 어떠한 정보들을 추가해서 다시 보낸다. /auth/facebook/callback 주소가 있어야 facebook-pasport가 리다이렉트한다.
issue
페이스북 로그인 후 어플 종료후 welcome 페이지로 재접속 시 무한루프에 빠지게 됨.
그 이유는 사용자 정보는 배열(메모리)에 저장된다. 배열(메모리)는 휘발성이기 때문에 껐다가 다시 키면 그 정보도 날아가지만 세션은 파일에 남아있다. 세션 정보와 사용자 정보가 동기화되지 않기 때문에 무한루프에 빠지게 된다. 이 경우 임시적으로 세션 데이터 파일을 삭제하면 된다.
FB 라우팅할 때 : 2번 진행된다.
FB을 통해 추가적으로 이메일주소나 다른 정보들도 알고 싶을 때, authenticate의 2번째 인자로 scope을 주면된다. (facebook login scope참고)
//fb-passport를 사용하는 경우 라우트가 두번 진행된다.app.get('/auth/facebook',passport.authenticate('facebook',{scope:'email'}));app.get('/auth/facebook/callback',passport.authenticate('facebook', { successRedirect:'/welcome', failureRedirect:'/auth/login' }));
passport.use 'profileFields' 명시한다.
passport.use(newFacebookStrategy({ clientID:783930845805363, clientSecret: bdcbfef6bdcbbd1042ff726301eebbd4, callbackURL:"/auth/facebook/callback", profileFields:['id','email','gender','link','locale','name','timezone','updated_time','verified','displayName'] },function(accessToken, refreshToken, profile, done) {//profile정보를 이용해서 사용자를 찾아본다.console.log(profile);var authId ='facebook:'+profile.id;for(var i=0;i<users.length;i++){var user = users[i];if(user.authId === authId){//fb으로 로그인하면 authId가 있음.이미 존재하는 사용자라면.returndone(null,user);//이미 존재하면 사용자 객체를 리턴. 아래 사용자 새로 생성하는 것은 실행X. }//done(null,user)에 의해 serializeUser가 실행된다. }var newuser = {'authId':authId,'displayName':profile.displayName,'email':profile.emails[0].value };users.push(newuser);done(null,newuser); }));
타사 인증을 통해 사용자 인증을 하다가 인증을 해주던 제3자가 없어지게 된다면 사용자의 프로파일에 있는 이메일 주소로 인증을 해서 지금까지의 사용자와 FB에 등록된 사용자가 같은지 확인하고 해당 사용자의 ID와 PW를 다시 입력받아서 LocalStrategy로 전환할 수도 있다.
LocalStrategy에서도 이메일을 받아서 비밀번호를 찾을 경우에 사용자 인증에 사용할 수 있다.