21 ~ 27.Dec.2020

Q kim·2020년 12월 22일
0

개발 일기

목록 보기
5/6

한주 예정

  • 담주부터 프론트에서 백엔드 api를 이용한다. 고로. API를 100%에 가깝게 input/output을 정리해야 한다. 그래서 계속 계속 확인하고 수정하고 확인하고 수정하고 반복일듯 하다.

  • 새로운 것을 할 수 있을라나 싶은데 새로운 것을 할 수 있다면 EC2를 한번 파보려고 한다.

  • [휴식] 크리스마스 연휴가 있다. 푹 쉬자.



21일_ Social login 이슈(passport.js)

#문제_ passport.js 과정속에서 data를 전달하지 못한다.
로그인 부분은 모두 동료가 맡아서 진행해왔다. 도중에 이슈가 하나 생겼다. passport.js를 이용하여 진행하고 있는데 특정 sns를 선택하기전에 유저 타입을 선택해야 한다. 예를 들면 커머스에서 판매자/구매자를 회원가입 전에 선택해야하는 상황이다. 그런데 이슈는 외부api다보니 + 외부api자체적으로 redirection하다보니 로그인전에 선택한 data(판매자인지 구매자인지)가 외부 api를 거치는 과정에서 사라진다는 것이다.

#해결_ 같은 strategy이지만 독립적인 복수개의 과정을 만든다.
이슈를 전달받자마자 그거 어떻게든 전달될텐데? 생각했다. request에 데이터 넣어주고 무슨 설정하면 될걸? 다른 방법은 아에 Strategy를 유저 타입개수만큼 분리시켜도 될텐데? 이거부터 먼저 체크해보자.

  1. 유저 타입 개수만큼 strategy 개수를 늘린다. 판매자용 strategy를 만들고, 구매자용 strategy를 만든다. 이제 진입점은 두개고 두개의 코드는 독립적이다.
// 두개의 FacebookStrategy를 등록해둔다.
passport.use('consumer', new FacebookStrategy(
  function(username, password, done) {
    User.findOne(/* ... */)
  }
));

passport.use('seller', new FacebookStrategy(
  function(username, password, done) {
    Company.findOne(/* ... */)
  }
));


// 개별 FacebookStrategy를 개별 상황에 맞게 이용한다.
// 두 strategy는 완전히 독립적으로 작동한다.
app.get('/consumer/login', 
  passport.authenticate('consumer', { successRedirect: '/consumer/home', failureRedirect: '/consumer/login' }));

app.get('/seller/login', 
  passport.authenticate('seller', { successRedirect: '/seller/home', failureRedirect: '/seller/login' }));

#해결2_ passReqToCallback 옵션
스택오플에서 찾은 방법
https://stackoverflow.com/questions/43265992/how-to-pass-an-additional-parameter-to-passport-authenticate

app.get('/auth/facebook/:appId', function(req,res,next){
    req._toParam = 'Hello';
    passport.authenticate(
        'facebook', { scope : 'email' }
    )(req,res,next);
})


fbStrategy.passReqToCallback = true;  
passport.use(new FacebookStrategy(fbStrategy,
    function(req, token, refreshToken, profile, done) {
        console.log(req._toParam);
        req._fromParam = 'Hello 2';
        var email = (profile.emails[0].value || '').toLowerCase()     
    process.nextTick(function() {...

req._toParam = 'consumer' or 'seller'을 넣어주고. passReqToCallback option을 준다면 전달이 된다고 한다.

비슷하지만 아주 조금 다른 코드를 두개 만드는 것보다 한가지 코드에서 두가지 일을 처리할수 있는게 더 코드의 양이 적어질 수 있으니. 이 방법이 더 좋을 수도 있다.

스토리의 결론: 동료분은 첫번째 해결책을 선택하셨다.

22일_ MongoDB in production 찾아보기.

실서비스에서 mongodb를 이용할때 유의할 것들에 대해 찾아보는 중이다.
연결 관리, 트렌젝션, 샤드, 등등 찾을게 많다.
다담주에 세부적인 세팅할때 참고하자.

23일_ 테스트 코드 작성 시작

24~27 크리스마스 연휴!



한주 마무리

크리스마스 연휴+ 회사 자체 휴일 때문에 잘 쉬었다.
하드워크로 돌아가자.

profile
https://medium.com/nodejs-server

0개의 댓글