OAuth Login service는 먼저 코드와 함께 Client service에 로그인 처리 요청을 보냄
OAuth Client service가 받은 코드를 가지고 {provider} 에 해당하는 Client(구현체)에 처리를 요청 (.login)
코드와 Body에 정보를 담아서 Provider의 Access token을 조회한 후 반환
OAuth Client service가 조회한 토큰을 가지고 유저 정보 획득 요청 (.getUserInfo)
Provider의 유저 정보 획득 API를 호출해 OAuth2UserInfo Dto를 생성 후 최종적으로 OAuth Login service에 반환
OAuth Login service는 OAuth2UserInfo 를 User service로 회원가입 및 로그인 요청을 보냄
우리 DB 회원가입/로그인 처리를 진행하고 jwtPlugin 사용해서 Access token을 생성, 반환
OAuth Login service가 Controller에 최종 생성된 우리 Access token (SignInResponse) 를 반환
파일의 분리가 구체적으로 되어있어 굉장히 복잡해보이지만 사실 코드적으로는 구현 부분이 짧습니다.
책임 정리:
OAuth Controller
/api/v1/auth/oauth2/{provider}/ 로 들어오는 REST API 요청을 받아 적절한 서비스에 요청 처리해달라고 위임합니다.
코드 발급 부분은 우리측 Service의 도움이 필요 없으니 OAuth Client service 에 바로 요청을 보내고
회원가입 / 로그인 부분은 우리측 Service의 도움이 필요하니 OAuth Login service 에 요청을 보냅니다.
OAuth Client service
POJO 인터페이스 OAuth2Client를 구현한 적절한 Provider client를 찾고 해당 client에 적절한 요청을 위임하는 service입니다.
OAuth Client
POJO 인터페이스 OAuth2Client를 구현한 구현체입니다.
OAuth2의 흐름에 보통 코드 발급 기반 인증이 사용되므로
코드 발급용 인증 서버에 보낼 Redirect url 만들기 (redirectUrl)
발급받은 코드로 Access token을 획득하는 API 호출하기 (getAccessToken)
가 어떤 소셜 로그인 제공자든 공통되게 필요하고
저희는 발급받은 토큰으로 Provider 의 API들을 이용할 수 있으므로
발급받은 토큰으로 Provider 에 있는 유저 정보를 획득하는 API 호출하기 (getUserInfo)
그리고 Client service에서 알아먹기 쉽게 나 이 Provider의 구현체에요 라고 알려주는 (support) 를 구현합니다.
OAuth Login service
로그인 요청을 위해 관련된 Service에 요청을 위임하는 service입니다.
현재는 회원가입/로그인만 필요하니 OAuth Client service 에 Client에서 필요한 만큼 Provider에 요청을 보내고
Provider가 제공한 정보를 우리가 만든 User service로 보내서 우리 DB에 회원가입 / 로그인 진행을 처리합니다.
그 외 common / config / dto는 저희가 쓰는 거랑 같은 이유로 작성되어 있습니다.
작업 사항
PR에서 작업한 사항들을 적어주세요(이미지, 스크린샷등을 활용해도 좋아요)
OAuth2 클라이언트를 위한 기본 구조 설정
Kakao, Naver client 구현
정상적인 회원가입 처리, username과 password는 랜덤한 문자열로 생성
(단, 우리측 username 중복이 발생할 수 있기에 Provider Id를 Seed로 하는 28글자의 랜덤한 username 을 쓰게 했습니다.)
요약
박찬준 튜터님의 OAuth flow를 토대로 작성되었습니다.
용어:
OAuth2UserInfo
Dto를 생성 후 최종적으로 OAuth Login service에 반환파일의 분리가 구체적으로 되어있어 굉장히 복잡해보이지만 사실 코드적으로는 구현 부분이 짧습니다.
책임 정리:
OAuth Controller /api/v1/auth/oauth2/{provider}/ 로 들어오는 REST API 요청을 받아 적절한 서비스에 요청 처리해달라고 위임합니다. 코드 발급 부분은 우리측 Service의 도움이 필요 없으니 OAuth Client service 에 바로 요청을 보내고 회원가입 / 로그인 부분은 우리측 Service의 도움이 필요하니 OAuth Login service 에 요청을 보냅니다.
OAuth Client service POJO 인터페이스
OAuth2Client
를 구현한 적절한 Provider client를 찾고 해당 client에 적절한 요청을 위임하는 service입니다.OAuth Client POJO 인터페이스
OAuth2Client
를 구현한 구현체입니다. OAuth2의 흐름에 보통 코드 발급 기반 인증이 사용되므로가 어떤 소셜 로그인 제공자든 공통되게 필요하고 저희는 발급받은 토큰으로 Provider 의 API들을 이용할 수 있으므로
그리고 Client service에서 알아먹기 쉽게
나 이 Provider의 구현체에요
라고 알려주는 (support) 를 구현합니다.그 외 common / config / dto는 저희가 쓰는 거랑 같은 이유로 작성되어 있습니다.
작업 사항
OAuth2 클라이언트를 위한 기본 구조 설정 Kakao, Naver client 구현 정상적인 회원가입 처리, username과 password는 랜덤한 문자열로 생성 (단, 우리측 username 중복이 발생할 수 있기에 Provider Id를 Seed로 하는 28글자의 랜덤한 username 을 쓰게 했습니다.)
리뷰 요청 사항(선택)
해결한 이슈
closes: #20