33import static com .oronaminc .join .member .util .MemberMapper .*;
44
55import java .util .Map ;
6- import java .util .Optional ;
76
7+ import org .springframework .beans .factory .annotation .Value ;
8+ import org .springframework .http .HttpEntity ;
9+ import org .springframework .http .HttpHeaders ;
10+ import org .springframework .http .HttpMethod ;
11+ import org .springframework .http .MediaType ;
12+ import org .springframework .http .ResponseEntity ;
813import org .springframework .security .oauth2 .client .userinfo .DefaultOAuth2UserService ;
9- import org .springframework .security .oauth2 .client .userinfo .OAuth2UserRequest ;
10- import org .springframework .security .oauth2 .core .OAuth2AuthenticationException ;
11- import org .springframework .security .oauth2 .core .user .OAuth2User ;
1214import org .springframework .stereotype .Service ;
1315import org .springframework .transaction .annotation .Transactional ;
16+ import org .springframework .util .LinkedMultiValueMap ;
17+ import org .springframework .util .MultiValueMap ;
18+ import org .springframework .web .client .RestTemplate ;
1419
1520import com .oronaminc .join .member .dao .MemberRepository ;
1621import com .oronaminc .join .member .domain .Member ;
1722import com .oronaminc .join .member .dto .GuestLoginRequest ;
23+ import com .oronaminc .join .member .dto .KakaoUserResponse ;
1824import com .oronaminc .join .member .service .MemberReader ;
25+ import com .oronaminc .join .member .util .MemberMapper ;
1926
2027import lombok .RequiredArgsConstructor ;
2128import lombok .extern .slf4j .Slf4j ;
@@ -27,32 +34,91 @@ public class AuthService extends DefaultOAuth2UserService {
2734 private final MemberRepository memberRepository ;
2835 private final MemberReader memberReader ;
2936
30- @ Override
31- public OAuth2User loadUser (OAuth2UserRequest userRequest ) throws OAuth2AuthenticationException {
32- OAuth2User oAuth2User = super .loadUser (userRequest );
33- Map <String , Object > attributes = oAuth2User .getAttributes ();
37+ private final RestTemplate restTemplate = new RestTemplate ();
38+
39+ private static final String TOKEN_URI = "https://kauth.kakao.com/oauth/token" ;
40+ private static final String USER_INFO_URI = "https://kapi.kakao.com/v2/user/me" ;
41+
42+ @ Value ("${spring.security.oauth2.client.registration.kakao.client-id}" )
43+ private String clientId ;
44+
45+ @ Value ("${spring.security.oauth2.client.registration.kakao.redirect-uri}" )
46+ private String redirectUri ;
47+
48+ @ Value ("${spring.security.oauth2.client.registration.kakao.client-secret}" )
49+ private String clientSecret ;
50+
51+ // @Override
52+ // public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
53+ // OAuth2User oAuth2User = super.loadUser(userRequest);
54+ // Map<String, Object> attributes = oAuth2User.getAttributes();
55+ //
56+ // log.info("attributes :: " + attributes);
57+ //
58+ // Map<String, Object> kakaoAccount = (Map<String, Object>) attributes.get("kakao_account");
59+ // Map<String, Object> profile = (Map<String, Object>) kakaoAccount.get("profile");
60+ //
61+ //
62+ // Optional<Member> optionalMember = memberReader.findByEmail(kakaoAccount.get("email").toString());
63+ //
64+ // Member member = optionalMember.orElseGet(() -> memberRepository.save(toKakaoMember(kakaoAccount, profile)));
65+ //
66+ // return toOAuth2MemberDetails(member);
67+ // }
3468
35- log .info ("attributes :: " + attributes );
69+ @ Transactional
70+ public MemberDetails loadGuest (GuestLoginRequest guestLoginRequest ) {
71+ Member guest = toGuestMember (guestLoginRequest );
3672
37- Map < String , Object > kakaoAccount = ( Map < String , Object >) attributes . get ( "kakao_account" );
38- Map < String , Object > profile = ( Map < String , Object >) kakaoAccount . get ( "profile" );
73+ memberRepository . save ( guest );
74+ guest . registerGuest ( );
3975
76+ return toGuestMemberDetails (guest );
77+ }
4078
41- Optional <Member > optionalMember = memberReader .findByEmail (kakaoAccount .get ("email" ).toString ());
79+ @ Transactional
80+ public MemberDetails kakaoLogin (String code ) {
81+ String accessToken = getAccessToken (code );
82+ KakaoUserResponse kakaoUser = getUserInfo (accessToken );
4283
43- Member member = optionalMember .orElseGet (() -> memberRepository .save (toKakaoMember (kakaoAccount , profile )));
84+ Member member = memberRepository .findByEmail (kakaoUser .email ())
85+ .orElseGet (() -> memberRepository .save (MemberMapper .toNewKakaoMember (kakaoUser )));
4486
4587 return toOAuth2MemberDetails (member );
4688 }
4789
48- @ Transactional
49- public MemberDetails loadGuest ( GuestLoginRequest guestLoginRequest ) {
50- Member guest = toGuestMember ( guestLoginRequest );
90+ private String getAccessToken ( String code ) {
91+ HttpHeaders headers = new HttpHeaders ();
92+ headers . setContentType ( MediaType . APPLICATION_FORM_URLENCODED );
5193
52- memberRepository .save (guest );
53- guest .registerGuest ();
94+ MultiValueMap <String , String > params = new LinkedMultiValueMap <>();
95+ params .add ("grant_type" , "authorization_code" );
96+ params .add ("client_id" , clientId );
97+ params .add ("redirect_uri" , redirectUri );
98+ params .add ("code" , code );
99+ params .add ("client_secret" , clientSecret );
54100
55- return toGuestMemberDetails (guest );
101+ HttpEntity <MultiValueMap <String , String >> request = new HttpEntity <>(params , headers );
102+
103+ ResponseEntity <Map > response = restTemplate .postForEntity (TOKEN_URI , request , Map .class );
104+
105+ return (String ) response .getBody ().get ("access_token" );
56106 }
57107
108+ private KakaoUserResponse getUserInfo (String accessToken ) {
109+ HttpHeaders headers = new HttpHeaders ();
110+ headers .setBearerAuth (accessToken );
111+ headers .setContentType (MediaType .APPLICATION_JSON );
112+
113+ HttpEntity <Void > entity = new HttpEntity <>(headers );
114+
115+ ResponseEntity <Map > response = restTemplate .exchange (USER_INFO_URI , HttpMethod .GET , entity , Map .class );
116+
117+ Map <String , Object > attributes = response .getBody ();
118+
119+ Map <String , Object > kakaoAccount = (Map <String , Object >) attributes .get ("kakao_account" );
120+ Map <String , Object > profile = (Map <String , Object >) kakaoAccount .get ("profile" );
121+
122+ return MemberMapper .toKakaoUserResponse (kakaoAccount , profile );
123+ }
58124}
0 commit comments