Google 소셜 로그인 진행 시 닉네임 설정 문제

윤준혁·2024년 7월 23일

문제 상황

  • 구글 소셜 로그인 진행 시 회원가입된 유저의 Nickname이 Null값으로 들어오는 오류를 발견
  • Kakao, Naver도 구현했지만 둘은 정상적으로 들어옴

  • 아래는 소셜 로그인으로 들어온 유저가 새로운 유저일 경우 유저 저장 코드
private User registerNewUser(OAuth2UserRequest oAuth2UserRequest, OAuth2UserInfo oAuth2UserInfo) {
    User user = User.builder()
            .provider(Provider.valueOf(oAuth2UserRequest.getClientRegistration().getRegistrationId()))
            .providerId(oAuth2UserInfo.getId())
            .nickname(oAuth2UserInfo.getName())
            .email(oAuth2UserInfo.getEmail())
            .role("USER")
            .build();

    return userRepository.save(user);
}

원인 분석

  • 원인을 분석하기 위해 구글 로그인을 진행했을 때, 구글의 Attribute를 살펴보았다
log.info("oAuth2UserInfo - Name : {}", oAuth2UserInfo.getName());
log.info("oAuth2UserInfo - Attributes : {}", oAuth2UserInfo.getAttributes());

  • 구글로부터 Name이나 Nickname에 대한 값을 받아오지 않는다는 걸 깜빡했다

해결 방법

  • 그래서 구글로 로그인 하는 유저들에게는 랜덤한 스트링값을 닉네임으로 만들어주기로 했다
private User registerNewUser(OAuth2UserRequest oAuth2UserRequest, OAuth2UserInfo oAuth2UserInfo) {
    if (oAuth2UserInfo.getProvider().equals("google")) {
        SecureRandom random = new SecureRandom();
        StringBuilder sb = new StringBuilder(8);

        String nickname;

        do {
            sb.setLength(0);
            for (int i = 0; i < 8; i++) {
                int index = random.nextInt(CHARACTERS.length());
                sb.append(CHARACTERS.charAt(index));
            }
            nickname = sb.toString();
        } while (userRepository.existsByNickname(nickname));

        User user = User.builder()
                .provider(Provider.valueOf(oAuth2UserRequest.getClientRegistration().getRegistrationId()))
                .providerId(oAuth2UserInfo.getId())
                .nickname(nickname)
                .email(oAuth2UserInfo.getEmail())
                .role("USER")
                .build();

        return userRepository.save(user);
    }

    User user = User.builder()
            .provider(Provider.valueOf(oAuth2UserRequest.getClientRegistration().getRegistrationId()))
            .providerId(oAuth2UserInfo.getId())
            .nickname(oAuth2UserInfo.getName())
            .email(oAuth2UserInfo.getEmail())
            .role("USER")
            .build();

    return userRepository.save(user);
}
  • 웹 서비스를 운영하는데 이건 이렇고, 저건 저렇고라는 생각이 들지 않게끔 하는 것도 중요하다는 생각이 들어 그냥 소셜 로그인을 통해 회원가입을 진행한 유저들은 모두 랜덤스트링의 닉네임을 주기로 결정했다
private User registerNewUser(OAuth2UserRequest oAuth2UserRequest, OAuth2UserInfo oAuth2UserInfo) {
    SecureRandom random = new SecureRandom();
    StringBuilder sb = new StringBuilder(8);

    String nickname;

    do {
        sb.setLength(0);
        for (int i = 0; i < 8; i++) {
            int index = random.nextInt(CHARACTERS.length());
            sb.append(CHARACTERS.charAt(index));
        }
        nickname = sb.toString();
    } while (userRepository.existsByNickname(nickname));

    User user = User.builder()
            .provider(Provider.valueOf(oAuth2UserRequest.getClientRegistration().getRegistrationId()))
            .providerId(oAuth2UserInfo.getId())
            .nickname(oAuth2UserInfo.getName())
            .email(oAuth2UserInfo.getEmail())
            .role("USER")
            .build();

    return userRepository.save(user);
}

결과

  • 근본론적인 해결 방법은 아니겠지만 모두가 평등한 닉네임을 갖게 되었고, 최종적으로 리펙토링하고, 코드 정리할 때 한 번 더 살펴봐야겠다

0개의 댓글