Skip to content

Commit

Permalink
[fix] kakao error fix
Browse files Browse the repository at this point in the history
  • Loading branch information
sunghyun1356 committed Jul 19, 2024
1 parent f230a66 commit 77d1e65
Show file tree
Hide file tree
Showing 3 changed files with 168 additions and 24 deletions.
136 changes: 130 additions & 6 deletions src/main/java/com/Lubee/Lubee/common/oauth/OauthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Slf4j
@Service
@RequiredArgsConstructor
Expand Down Expand Up @@ -70,9 +71,9 @@ public String getKakaoAccessToken(String code) {
BufferedWriter bw = new BufferedWriter((new OutputStreamWriter(conn.getOutputStream()))); // 전송하기 위한 것
StringBuilder sb = new StringBuilder();
sb.append("grant_type=authorization_code");
sb.append("&client_id=b44b96ece6b8e583992e31faf51c9504"); // 배포 하고 나서 설정
sb.append("&redirect_uri=http://localhost:8080/api/users/kakao"); // 이부분 나중에 변경해야함
sb.append("&client_secret=??????"); // 이거는 나중에 코드에서 삭제해야 함(secret key니까!)
sb.append("&client_id=37ff99a682a47c8a4c61cd10f699a17f"); // 배포 하고 나서 설정
sb.append("&redirect_uri=http://localhost:8080/api/users/kakao/simpleLogin"); // 이부분 나중에 변경해야함
sb.append("&client_secret=AYKKr2WWSmWqlLb7gfMPmpuvQZUDXC2G");
sb.append("&code=").append(code);
bw.write(sb.toString());
bw.flush();
Expand Down Expand Up @@ -131,7 +132,7 @@ public KakaoUserInfoDto getKakaoUserInfo(String accessToken) {
conn.setRequestMethod("GET");
conn.setDoOutput(true);
conn.setRequestProperty("Authorization", "Bearer " + accessToken); //전송할 header 작성, access_token전송

System.out.println("conn" + conn);
//결과 코드가 200이라면 성공
int responseCode = conn.getResponseCode();
System.out.println("responseCode : " + responseCode);
Expand Down Expand Up @@ -191,7 +192,7 @@ public ApiResponseDto<TokenDto> kakaoLoginOrSignup(String kakaoAccesstoken, Sign
2-2. DB에 있는 ID면 -> 로그인
*/

KakaoUserInfoDto kakaoUserInfoDto = getKakaoUserInfo(kakaoAccesstoken); // 카카오 유저 정보 받아오기
KakaoUserInfoDto kakaoUserInfoDto = kakaoUserDetail(kakaoAccesstoken); // 카카오 유저 정보 받아오기

// 아이디, 비밀번호 받아오기
String username = kakaoUserInfoDto.getKakaoId();
Expand Down Expand Up @@ -286,4 +287,127 @@ public ApiResponseDto<TokenDto> refreshKakaoToken(String accessTokenOrigin, Stri
return ResponseUtils.ok(tokenDto, null);
}


@Transactional
public ApiResponseDto<TokenDto> kakaoLoginOrSignupSimple(String code) {

String kakaoAccessToken = getKakaoAccessToken(code);
KakaoUserInfoDto kakaoUserInfoDto = getKakaoUserInfo(kakaoAccessToken); // 카카오 유저 정보 받아오기

System.out.println("kakaoUserInfoDto: " + kakaoUserInfoDto);
// 아이디, 비밀번호 받아오기
String username = kakaoUserInfoDto.getKakaoId();
String password = passwordEncoder.encode("kakaouserpassword"); // 카카오 유저 비밀번호 임의 설정
System.out.println("Username: " + username);
System.out.println("Password: " + password);
// 회원 아이디 중복 확인 -> DB에 존재하지 않으면 회원가입 수행
Optional<User> user = userRepository.findByUsernameAndLoginType(username, LoginType.KAKAO);
TokenDto tokenDto = new TokenDto();
// 회원가입 온보딩을 한다.
if (user.isEmpty()) {
// 입력한 username, password, admin 으로 user 객체 만들어 repository 에 저장
UserRoleEnum role = UserRoleEnum.USER; // 카카오 유저 ROLE 임의 설정
User signUpUser = User.of(LoginType.KAKAO, username, password, role);
signUpUser.setLoginType(LoginType.KAKAO);


String accessToken = jwtUtil.createAccessToken(signUpUser.getUsername(), signUpUser.getRole());
String refreshToken = jwtUtil.createRefreshToken(signUpUser.getUsername(), signUpUser.getRole());

// refresh token을 DB에 저장
signUpUser.setKakaoRefreshToken(refreshToken);
userRepository.save(signUpUser);

// response 생성
tokenDto.setMessage("카카오 회원가입 절반 성공, 온보딩으로 이동!");
tokenDto.setAccessToken(accessToken);
tokenDto.setRefreshToken(refreshToken);


} else { // DB에 존재하면 로그인 수행
// 토큰 생성

String accessToken = jwtUtil.createAccessToken(user.get().getUsername(), user.get().getRole());
String refreshToken = jwtUtil.createRefreshToken(user.get().getUsername(), user.get().getRole());

// refresh token을 DB에 저장
user.get().setKakaoRefreshToken(refreshToken);
userRepository.save(user.get());

// response 생성
tokenDto.setMessage("카카오 로그인 성공");
tokenDto.setAccessToken(accessToken);
tokenDto.setRefreshToken(refreshToken);


}
return ResponseUtils.ok(tokenDto, null);
}

@Transactional
// 기존 카카오 로그인 매서드
public ApiResponseDto<TokenDto> kakaoSimpleOld(String code) {
/*
*** 아래 링크에서 카카오 로그인 하면 회원가입/로그인 됨 ***
kauth.kakao.com/oauth/authorize?client_id=bdae78483f052375d4334586ceee5544&redirect_uri=http://localhost:8080/api/oauth/kakao&response_type=code
1. kauth.kakao.com/oauth/authorize로 들어가서 카카오 로그인 수행 -> 로그인 코드 반환
2. kapi.kakao.com/v2/user/me에서 로그인 코드 입력 -> 엑세스 토큰 반환
3. 엑세스 토큰으로 유저 정보 받아오기
4-1. DB에 없는 ID면 -> 회원가입
4-2. DB에 있는 ID면 -> 로그인
*/

String kakaoAccessToken = getKakaoAccessToken(code); // 카카오 access token 받아오기
KakaoUserInfoDto kakaoUserInfoDto = getKakaoUserInfo(kakaoAccessToken); // 카카오 유저 정보 받아오기

// 아이디, 비밀번호 받아오기
String username = kakaoUserInfoDto.getKakaoId();
String password = passwordEncoder.encode("kakaouserpassword"); // 카카오 유저 비밀번호 임의 설정

// 회원 아이디 중복 확인 -> DB에 존재하지 않으면 회원가입 수행
Optional<User> user = userRepository.findByUsername(username);

if (user.isEmpty()) {
// 입력한 username, password, admin 으로 user 객체 만들어 repository 에 저장
UserRoleEnum role = UserRoleEnum.USER; // 카카오 유저 ROLE 임의 설정
User signUpUser = User.of(LoginType.KAKAO, username, password, role);

// 토큰 생성
TokenDto tokenDto = new TokenDto();

String accessToken = jwtUtil.createAccessToken(signUpUser.getUsername(), signUpUser.getRole());
String refreshToken = jwtUtil.createRefreshToken(signUpUser.getUsername(), signUpUser.getRole());

// refresh token을 DB에 저장
signUpUser.setKakaoRefreshToken(refreshToken);
userRepository.save(signUpUser);

// response 생성
tokenDto.setMessage("카카오 회원가입 성공");
tokenDto.setAccessToken(accessToken);
tokenDto.setRefreshToken(refreshToken);

return ResponseUtils.ok(tokenDto, null);

} else { // DB에 존재하면 로그인 수행
// 토큰 생성
TokenDto tokenDto = new TokenDto();

String accessToken = jwtUtil.createAccessToken(user.get().getUsername(), user.get().getRole());
String refreshToken = jwtUtil.createRefreshToken(user.get().getUsername(), user.get().getRole());

// refresh token을 DB에 저장
user.get().setKakaoRefreshToken(refreshToken);
userRepository.save(user.get());

// response 생성
tokenDto.setMessage("카카오 로그인 성공");
tokenDto.setAccessToken(accessToken);
tokenDto.setRefreshToken(refreshToken);

return ResponseUtils.ok(tokenDto, null);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class UserController {
// kakao로그인을 통해서 유저 기록이 있으면 바로 로그인을 진행한다
// 커플 연동에 대한 여부를 확인한 뒤 바로 회원가입을 진행한다.
@PostMapping("/kakao")
public ApiResponseDto<TokenDto> kakaoLogin(@RequestParam("kakaoAccessToken") String kakaoAccessToken,
public ApiResponseDto<TokenDto> kakaoLogin(@RequestParam("code") String kakaoAccessToken,
@RequestBody SignupDto signupDto,
@RequestBody Date startDate) {

Expand All @@ -34,6 +34,29 @@ public ApiResponseDto<TokenDto> kakaoLogin(@RequestParam("kakaoAccessToken") Str
return oAuthService.kakaoLoginOrSignup(kakaoAccessToken, signupDto, startDate);
}

@PostMapping("/kakao/simpleLogin")
public ApiResponseDto<TokenDto> kakaoSimple(
@RequestParam("code") String kakaoAccessToken
)
{
if (kakaoAccessToken == null || kakaoAccessToken.isEmpty()) {
throw new IllegalArgumentException("Kakao access token is required");
}
return oAuthService.kakaoLoginOrSignupSimple(kakaoAccessToken);
}

@PostMapping("/kakao/simpleLoginOld")
public ApiResponseDto<TokenDto> kakaoSimpleOld(
@RequestParam("code") String kakaoAccessToken
)
{
if (kakaoAccessToken == null || kakaoAccessToken.isEmpty()) {
throw new IllegalArgumentException("Kakao access token is required");
}
return oAuthService.kakaoSimpleOld(kakaoAccessToken);
}


@PostMapping("/kakao/refresh")
public ApiResponseDto<TokenDto> kakaorefreshToken(
@RequestHeader(value="accessToken") String accessToken,
Expand Down
31 changes: 14 additions & 17 deletions src/main/java/com/Lubee/Lubee/user/domain/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,21 +26,20 @@
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@DynamicInsert
@Table(name = "user")
public class User extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "userid")
private Long id;

// 여기서 카카오 아이디가 들어간다
@Column(nullable = false)
private String username;

@Column(nullable = false)
private String password;

@Column(nullable = false, unique = true)
@Column(nullable = true, unique = true)
private String email;

@DateTimeFormat(pattern = "yyyy-MM-dd")
Expand All @@ -67,7 +66,7 @@ public class User extends BaseEntity {
private List<UserCalendarMemory> userCalendarMemories;

@ManyToOne
@JoinColumn(name = "couple_id", nullable = false)
@JoinColumn(name = "couple_id")
private Couple couple;

@OneToMany(mappedBy = "user")
Expand All @@ -78,39 +77,37 @@ public class User extends BaseEntity {

private LoginType loginType;

// 카카오 로그인 refresh 토큰
private String kakaoRefreshToken;

@Builder
public User(LoginType socialType, String socialId) {
this.loginType = socialType;
this.username = socialId;
}
public User(String username, String email, String userPuzzleId, UserRoleEnum role, String refreshToken, LoginType loginType )
{

public User(String username, String email, String userPuzzleId, UserRoleEnum role, String refreshToken, LoginType loginType) {
this.username = username;
this.email = email;
this.role = role;
this.kakaoRefreshToken = refreshToken;
this.loginType = loginType;

}
public static User of(LoginType loginType, String username, String password, UserRoleEnum role) {
User user = new User(loginType, username); // 일반 로그인 타입으로 사용자 생성
user.setPassword(password); // 패스워드 설정
user.setRole(role); // 역할 설정
return user; // 사용자 반환

public static User of(LoginType loginType, String username, String password, UserRoleEnum role) {
User user = new User(loginType, username);
user.setPassword(password);
user.setRole(role);
return user;
}

public void linkCouple(Couple couple) { // 커플 연결됐을 때 user 정보 변경
public void linkCouple(Couple couple) {
this.couple = couple;
this.alreadyCouple = true;
}
public void UserSignup(User user, SignupDto signupDto)
{

public void UserSignup(User user, SignupDto signupDto) {
user.setNickname(signupDto.getNickname());
user.setProfile(signupDto.getProfile());
user.setBirthday(signupDto.getBirthday());
}

}

0 comments on commit 77d1e65

Please sign in to comment.