one-day-one-meal / one-hour-one-meal

1 stars 0 forks source link

✨ OAuth2 소셜 로그인 #75

Closed mobzzzzz closed 4 months ago

mobzzzzz commented 4 months ago

요약

간단 요약

oauth_flow

박찬준 튜터님의 OAuth flow를 토대로 작성되었습니다.

용어:

  1. OAuth Controller로 소셜 로그인 요청 들어옴 (/api/v1/auth/oauth2/{provider}/login)
  2. OAuth Client Service에서 {provider} 에 해당하는 Client를 선택 (.select)
  3. 해당 Client에 Provider로 보내야 하는 redirectUrl 생성 요청 (.redirectUrl)
  4. Controller에서 redirectUrl 받아서 HttpServletResponse 에 .sendRedirect 실행
  5. Provider측 인증 서버에서 내가 보낸 요청(redirectUrl query에 담긴 정보)를 알아서 막 처리함 (우린 모름)
  6. 성공하면 Provider가 내 Controller의 Redirect url로 redirectUrl Authorization code 발급 (이하 코드)
  7. 발급받은 코드로 OAuth Login service에 로그인 요청
  8. OAuth Login service는 먼저 코드와 함께 Client service에 로그인 처리 요청을 보냄
  9. OAuth Client service가 받은 코드를 가지고 {provider} 에 해당하는 Client(구현체)에 처리를 요청 (.login)
  10. 코드와 Body에 정보를 담아서 Provider의 Access token을 조회한 후 반환
  11. OAuth Client service가 조회한 토큰을 가지고 유저 정보 획득 요청 (.getUserInfo)
  12. Provider의 유저 정보 획득 API를 호출해 OAuth2UserInfo Dto를 생성 후 최종적으로 OAuth Login service에 반환
  13. OAuth Login service는 OAuth2UserInfo 를 User service로 회원가입 및 로그인 요청을 보냄
  14. 우리 DB 회원가입/로그인 처리를 진행하고 jwtPlugin 사용해서 Access token을 생성, 반환
  15. OAuth Login service가 Controller에 최종 생성된 우리 Access token (SignInResponse) 를 반환

파일의 분리가 구체적으로 되어있어 굉장히 복잡해보이지만 사실 코드적으로는 구현 부분이 짧습니다.

책임 정리:

가 어떤 소셜 로그인 제공자든 공통되게 필요하고 저희는 발급받은 토큰으로 Provider 의 API들을 이용할 수 있으므로

그리고 Client service에서 알아먹기 쉽게 나 이 Provider의 구현체에요 라고 알려주는 (support) 를 구현합니다.

그 외 common / config / dto는 저희가 쓰는 거랑 같은 이유로 작성되어 있습니다.

작업 사항

PR에서 작업한 사항들을 적어주세요(이미지, 스크린샷등을 활용해도 좋아요)

OAuth2 클라이언트를 위한 기본 구조 설정 Kakao, Naver client 구현 정상적인 회원가입 처리, username과 password는 랜덤한 문자열로 생성 (단, 우리측 username 중복이 발생할 수 있기에 Provider Id를 Seed로 하는 28글자의 랜덤한 username 을 쓰게 했습니다.)

리뷰 요청 사항(선택)

리뷰시 봐주었으면 하는 부분이 있다면 적어주세요


해결한 이슈

closes: #20