Nov 8-12, 2021

Sung Hyun Hong (Jenny)·2022년 1월 25일
0

Refactoring 기간 but 부족한 개념 정리용

  1. passport 이용한 kakao로그인 구현 정리

passport란 무엇인가?

node.js에서 authenticate 적용할때, 사용 할 수 있는 미들웨어이다. 클라이언트가 서버에 요청할 자격이 있는지 인증할 때에 passport 미들웨어를 사용한다

1) passport 관련 패키지 설치

npm i passport passport-local passport-kakao bcrypt

2) app.js 와 미리 연결

passport.initialize 미들웨어는 요청(req객체)에 passport 설정을 저장한다.

passport.initialize() 메서드는 서버의 요청(req 객체)에 passport 폴더의 index.js에 작성한 설정들을 입력합니다. passport를 미들웨어로 사용하겠다는 선언의 의미로 생각하시면 됩니다.
passport.session() 메서드는 req.session에 passport의 정보들을 저장합니다. req.session은 express-session을 통해 생성되므로, express-session 미들웨어보다 뒤에 표기해야 합니다.

3) passport폴더 안에 index.js 파일 만들기

passport는 세션에 불필요한 데이터를 담아두지 않기 위해 사용하며, serializeUser, deserializeUser가 핵심

serializeUser는 req.session 객체에 어떤 데이터를 저장할지 선택합니다. 유저의 정보 모두를 담는 것은 효율적이지 않기 때문에, id와 같이 고유한 값만을 저장하는 것이 바람직합니다. serializeUser 메서드는 로그인시에 딱 한번 실행됩니다.deserializeUser는 페이지를 이동할때마다 (passport.session()이 실행될때마다) 호출됩니다. serializeUser를 통해 req.sessiond에는 id만 저장되었으므로, req.session에 담긴 id를 Local database인 User에서 조회합니다. 조회된 결과값은 req.user에 담기므로, req.user를 통해 로그인된 사용자의 정보를 사용할 수 있습니다.

serializeUser는 세션에 사용자 정보를 저장

deserializeUser는 매 요청시마다 실행되며, serializeUser에서 세션에 저장했던 아이디를 받아 DB에서 사용자 정보를 조회

passport.use의 첫번째 인자에서는 LocalStrategy의 usernameField와 passwordField의 value 값들에 각각 req.body의 속성명을 담아줘야 합니다. 이메일 값이 req.body.email에 담겨있다면, 'email'로 작성되어야 합니다.passport.use의 두번째 인자에서는 실제 전략을 수행하는 로직을 작성합니다. 유저가 존재하는지, 비밀번호는 일치하는지 등의 로직들을 작성합니다.done 함수의 첫번째 인자는 error 여부, 두번째 인자는 결과값, 세번째 인자는 실패하였을 경우에 정보입니다.
성공하였을 경우 done(null, user)
실패하였을 경우 done(null, false, 실패정보)
에러인 경우 done(error)를 넘겨주면 됩니다.
따라서,
성공하였을 경우에 done(null, existed);
실패하였을 경우에 done(null, false, 실패 정보);
에러인 경우에는 done(err)를 담아주었습니다..

4) passport폴더 밑에 Kakaostrategy.js 작성

5) routes 폴더 밑에 auth.js에 kakao 컨트롤러 작성

passport 미들웨어를 사용하면 req.isAuthenticated() 메서드를 사용할 수 있습니다. 만약 로그인되어 세션에 유저 정보가 담겨있다면 req.isAuthenticated()의 결과값은 true입니다. 반대로 로그인 상태가 아니라면 false를 반환합니다.* next()를 실행할 경우에만 다음 미들웨어로 넘어갈 수 있습니다. *이렇게 작성한 미들웨어를 라우터에서 불러와서 사용합니다.router.post('/signup', isLogOut, async (req, res, next) => {
  .....
}
회원가입의 경우 로그아웃된 상태에만 진행하고 싶다면, 중간에 이 미들웨어 객체에서 작성한 isLogOut 함수를 삽입하여 회원가입 로직을 진행하도록 할 수 있습니다.router.get('/logout', isLogIn, (req, res, next) => {
  .....
}
로그아웃의 경우 로그인된 상태에만 진행하고 싶다면, isLogIn 함수를 삽입합니다.

6) app.js에서 routes 연결

7) nodemon 실행 후 카카오 로그인하면 완료

https://ko.myservername.com/mysql-count-count-distinct-with-examples#Simple_COUNT

https://medium.com/@vdongbin/node-js-passport-사용하기-33e2eab2389b

https://imcreator.tistory.com/67

https://chanyeong.com/blog/post/28

자바스크립트 문법 구조 ref.

https://engineering.huiseoul.com/자바스크립트는-어떻게-작동하는가-이벤트-루프와-비동기-프로그래밍의-부상-async-await을-이용한-코딩-팁-다섯-가지-df65ffb4e7e

https://velog.io/@jeongho3786/Event-Loop와-비동기Callback-Promise-Async-Await

https://www.youtube.com/watch?v=QFHyPInNhbo

https://joshua1988.github.io/web-development/javascript/js-async-await/#async--await는-뭔가요

profile
오늘 하루도 열심히!

0개의 댓글