navis

구글 로그인 API 연동 (Spring boot) 본문

API

구글 로그인 API 연동 (Spring boot)

menstua 2024. 8. 28. 14:46
728x90

Google Cloud Platform 설정

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

 

목차 

1. Google Developers 설정

    • Google API 콘솔에 접속하여 로그인
    • 프로젝트 생성프로젝트 이름: google-login
    • 프로젝트 대시보드로 이동

2. Google Developers 설정

  • 동의 화면 구성 메뉴로 이동
  • User Type 설정
    • User Type: 외부
  • 앱 정보 입력
    • 앱 이름: OAuth2.0 구글 로그인
    • 사용자 지원 이메일 입력
  • 범위 설정
  • 설정 저장 및 계속

3. API 설정

  • 사용자 인증 정보 메뉴에서 OAuth 클라이언트 ID 생성
  • 애플리케이션 유형 설정
    • 유형: 웹 애플리케이션
    • 승인된 리디렉션 URI: http://localhost:8080/login/oauth2/code/google
  • 클라이언트 ID와 보안 비밀번호 생성 및 저장

4. 실습 예제

  • Spring Boot에서 구글OAuth2 로그인 구현하기
  • 사용자 정보 출력 예제

5. 마무리

  • 개발 시 주의사항 및 팁
  • 추가 참고 자료 및 문서

 

 

1. Google API 콘솔 프로젝트 생성

구글 간편 로그인을 구현하기 위해서는 먼저 Google API 콘솔에서 프로젝트를 생성해야 합니다.

Google API 콘솔 프로젝트 생성

1.Google API 콘솔에 접속하여 로그인합니다.

 

2. 상단 메뉴에서 프로젝트 선택을 클릭한 후 새 프로젝트 만들기를 선택합니다.

 

 

3. 프로젝트 이름을 google-login으로 입력하고 만들기 버튼을 클릭합니다.

 

 

4. 프로젝트가 생성되면 자동으로 해당 프로젝트 대시보드로 이동합니다.

 


2. 동의 화면 구성

OAuth 2.0을 통해 사용자가 로그인할 때 표시되는 동의 화면을 구성합니다.

동의 화면 구성

1. 사용자 인증 정보 메뉴에서 동의 화면 구성을 클릭합니다.

 

 

2. User Type 외부로 선택하고 만들기 버튼을 클릭합니다.

 

 

3. 앱 이름을 OAuth2.0 구글 로그인, 사용자 지원 이메일을 입력합니다.

 

 

 

5. 범위 추가 또는 삭제를 클릭하고 조회하고픈 정보의 범위를 지정합니다.

 

 

6. 다른 설정은 추가하지 않고, 저장 후 계속 버튼을 클릭합니다.

 


3. OAuth 클라이언트 생성

동의 화면 구성이 완료되면 OAuth 2.0 클라이언트를 생성하여 구글 로그인에 필요한 인증 정보를 설정합니다.

OAuth 클라이언트 생성

 

1. 사용자 인증 정보 만들기 버튼을 클릭하고 OAuth 클라이언트 ID를 선택합니다.

 

 

2. 애플리케이션 유형을 웹 애플리케이션으로 선택하고, 이름을 임의로 설정한 후, 승인된 리디렉션 URI 섹션에서 URI 추가 버튼을 클릭하여 http://localhost:8080/login/oauth2/code/google를 입력합니다.

 

 

3. 만들기 버튼을 클릭하여 클라이언트 ID와 클라이언트 보안 비밀번호(Client Secret)를 생성합니다. 생성된 클라이언트 ID와 클라이언트 보안 비밀번호를 확인하고 안전한 곳에 저장해 둡니다.

 


4. 실습 예제

Spring Boot 환경에서 구글 로그인을 구현하고, OAuth2 인증을 통해 사용자 정보를 요청하는 예제를 진행합니다. 이를 통해 실습을 통해 네이버 로그인을 웹 애플리케이션에 적용할 수 있습니다.

 

 

GoogleOauth2UserService

@Service
public class GoogleOAuth2UserService implements CustomOAuth2UserService {

    private final DefaultOAuth2UserService delegate = new DefaultOAuth2UserService();

    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {

        OAuth2User oAuth2User = delegate.loadUser(userRequest);
        Map<String, Object> attributes = oAuth2User.getAttributes();

        // 사용자 정보를 DB에 저장하거나 업데이트하는 로직을 추가합니다.
        saveOrUpdateUser(attributes, "google");

        List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_USER");

        String userNameAttributeName = userRequest.getClientRegistration()
                .getProviderDetails()
                .getUserInfoEndpoint()
                .getUserNameAttributeName();

        return new DefaultOAuth2User(authorities, attributes, userNameAttributeName);
    }

    private void saveOrUpdateUser(Map<String, Object> attributes, String provider) {
        // 사용자 정보를 DB에 저장하거나 업데이트하는 로직을 추가합니다.
        // 예: UserRepository를 사용하여 사용자 정보를 저장/업데이트
    }
}

 

GoogleSuccessHandler

 

@Component
public class GoogleSuccessHandler implements OAuth2SuccessHandler {

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException {
        DefaultOAuth2User oAuth2User = (DefaultOAuth2User) authentication.getPrincipal();
        Map<String, Object> attributes = oAuth2User.getAttributes();

        // 구글 프로필 정보 처리
        String email = attributes.get("email").toString();

        Map<String, Object> responseData = Map.of("email", email);

        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write(new ObjectMapper().writeValueAsString(responseData));
    }
}

 

SecurityConfig

        // OAuth2 로그인 처리 및 사용자 서비스 설정
        http.oauth2Login(oauth2 -> oauth2
                .loginPage("/login")
                .userInfoEndpoint(userInfo -> userInfo
                        .userService((OAuth2UserRequest userRequest) -> {
                            String registrationId = userRequest.getClientRegistration().getRegistrationId();
                            CustomOAuth2UserService service = oAuth2UserServiceManager.getService(registrationId);
                            if (service != null) {
                                return service.loadUser(userRequest);
                            } else {
                                throw new IllegalArgumentException("No service found for registrationId: " + registrationId);
                            }
                        })
                )
                .successHandler((request, response, authentication) -> {
                    if (authentication instanceof OAuth2AuthenticationToken oauthToken) {
                        String registrationId = oauthToken.getAuthorizedClientRegistrationId();
                        OAuth2SuccessHandler handler = oAuth2SuccessHandlerManager.getHandler(registrationId);
                        if (handler != null) {
                            handler.onAuthenticationSuccess(request, response, authentication);
                        } else {
                            throw new IllegalArgumentException("No handler found for registrationId: " + registrationId);
                        }
                    }
                })
        );

5. 마무리

개발 시 주의해야 할 사항들과 함께, API 연동 시 발생할 수 있는 문제들에 대한 팁을 제공합니다. 또한, 추가적으로 참고할 수 있는 문서와 자료들을 안내하여 네이버 로그인 API 연동을 완벽히 이해할 수 있도록 돕습니다.

'API' 카테고리의 다른 글

네이버 로그인 API 연동 (Spring boot)  (0) 2024.08.28
카카오 로그인 API 연동 (Spring boot)  (4) 2024.08.27