항해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);