고을마을 : 나의 코딩 이야기

카카오 로그인 유저가 일반로그인을 했을때 나타나는 오류 본문

항해99 7기/TIL(Today I Learned)

카카오 로그인 유저가 일반로그인을 했을때 나타나는 오류

고을마을 2022. 8. 1. 23:20

뜬금없이 우리 조가 만든 서비스에 
카카오로 회원가입한 아이디와 비밀번호를 일반로그인에 기입해 send를 눌러봤다.

근데 비밀번호가 틀렸다는 오류가 반환되는게 아닌가?

 

 

이유는 

첫 소셜로그인일 경우 DB에 저장될때

 

private void registerKakaoUser(KakaoUserInfo kakaoUserInfo) {

    String password = UUID.randomUUID().toString();
    String encodedPassword = passwordEncoder.encode(password);

    System.out.println("registerKakaoUser");
    System.out.println(kakaoUserInfo.getKakaoMemberId());
    User kakaoUser = User.builder()
            .kakaoId(kakaoUserInfo.getKakaoId())
            .username(kakaoUserInfo.getKakaoMemberId())
            .password(encodedPassword)
            .nickname("default")
            .role(UserRoleEnum.USER)
            .build();
    userRepository.save(kakaoUser);

 

패스워드를 임의로 uuid 랜덤값으로 넣어주기 때문에 일반로그인으로 카카오 아이디와 비밀번호를 입력하면 

비밀번호가 오류라는 validator에 걸려서 400에러를 반환하는 것이었다.

 

따라서,

@Transactional
public Map<String, Object> login(LoginDto loginDto) {
    UserValidator.validateUsernameEmpty(loginDto);
    UserValidator.validatePasswordEmpty(loginDto);

    User user = userRepository.findByUsername(loginDto.getUsername()).orElseThrow(
            () -> new CustomException(ErrorCode.LOGIN_NOT_FOUNT_MEMBERID)
    );

    if (!passwordEncoder.matches(loginDto.getPassword(), user.getPassword())) {
        if (user.getKakaoId()!=null){
            throw new CustomException(ErrorCode.LOGIN_NOT_KAKAOUSER);
        }else {
            throw new CustomException(ErrorCode.LOGIN_PASSWORD_NOT_MATCH);
        }
    }

    Long userId = user.getId();

    TokenDto tokenDto = jwtTokenProvider.createToken(user);

    RefreshToken refreshToken = new RefreshToken(loginDto.getUsername(), tokenDto.getRefreshToken());
    refreshTokenRepository.save(refreshToken);

    Map<String, Object> data = new HashMap<>();
    data.put("userId", userId);
    data.put("token", tokenDto);

    return data;

 

카카오 로그인 회원들이 갖고 있는 고유 long 값 kakaoId를 활용하여 
kakaoId가 null이 아닐때! 

카카오 USER는 카카오 로그인을 해주세요.라는 CustomException을 반환되도록 구현해서 유저들의 카카오로그인을 유도했다.


 if (!passwordEncoder.matches(loginDto.getPassword(), user.getPassword())) {
        if (user.getKakaoId()!=null){
            throw new CustomException(ErrorCode.LOGIN_NOT_KAKAOUSER);