diff --git a/src/main/java/com/devpass/global/oauth/service/CustomOAuth2UserService.java b/src/main/java/com/devpass/global/oauth/service/CustomOAuth2UserService.java index 89cd9b9..baabdff 100644 --- a/src/main/java/com/devpass/global/oauth/service/CustomOAuth2UserService.java +++ b/src/main/java/com/devpass/global/oauth/service/CustomOAuth2UserService.java @@ -1,5 +1,10 @@ package com.devpass.global.oauth.service; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.List; +import java.util.Map; import java.util.Optional; import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; @@ -20,6 +25,7 @@ import com.devpass.global.oauth.util.JWTUtil; import com.devpass.global.payload.apicode.ErrorStatus; import com.devpass.global.payload.error.exception.GeneralException; +import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletResponse; @@ -52,6 +58,12 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic } String providerId = oAuth2Response.getProviderId(); + String email = oAuth2Response.getEmail(); + + if (email == null || email.isBlank()) { + String accessToken = userRequest.getAccessToken().getTokenValue(); + email = fetchPrimaryEmailFromGitHub(accessToken); + } Optional existData = userRepository.findByProviderId(providerId); @@ -59,7 +71,7 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic User userEntity = User.builder() .name(oAuth2Response.getName()) - .email(oAuth2Response.getEmail()) + .email(email) .provider(oAuth2Response.getProvider()) .providerId(oAuth2Response.getProviderId()) .build(); @@ -82,6 +94,7 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic user.updateEmail(oAuth2Response.getEmail()); userRepository.save(user); + userRepository.flush(); UserDTO userDTO = UserDTO.builder() .id(user.getId()) @@ -108,4 +121,30 @@ public TokenDTO reissue(Long userId, HttpServletResponse response) { return tokenDTO; } + + private String fetchPrimaryEmailFromGitHub(String accessToken) { + try { + URL url = new URL("https://api.github.com/user/emails"); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setRequestProperty("Authorization", "Bearer " + accessToken); + connection.setRequestProperty("Accept", "application/vnd.github+json"); + + int responseCode = connection.getResponseCode(); + if (responseCode == 200) { + ObjectMapper objectMapper = new ObjectMapper(); + List> emails = objectMapper.readValue(connection.getInputStream(), List.class); + for (Map emailObj : emails) { + Boolean primary = (Boolean) emailObj.get("primary"); + Boolean verified = (Boolean) emailObj.get("verified"); + if (Boolean.TRUE.equals(primary) && Boolean.TRUE.equals(verified)) { + return emailObj.get("email").toString(); + } + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } } \ No newline at end of file