Springboot

[Springboot] 43. OAuth 2.0 (5단계-소셜 로그인 API 연동- 자동 회원가입/로그인 처리)

Song hyun 2024. 8. 16. 11:12
728x90
반응형

[Springboot] 43. OAuth 2.0 (5단계-소셜 로그인 API 연동- 자동 회원가입/로그인 처리)

 

1. KakaoDevelopers - 자동 로그인 처리

: 우리 서버에 회원가입 시에 패스워드 제약 -> not null (무조건 값이 들어가야 한다.)

 

(1) 기존 회원 정보 조회를 위한 searchUsername()

	/**
	 * username 사용자 존재 여부 조회
	 * @param String username
	 * @return User / null
	 */
	public User searchUsername(String username) {
		return userRepository.findByUsername(username);
	}

 

(2) 자동 회원가입 처리

	// 코드 추가 
	@GetMapping("/logout")
	public String logout() {
		session.invalidate(); // 로그아웃 됨 
		return "redirect:/user/sign-in";
	}
	
	@GetMapping("/kakao")
	@ResponseBody //  @RestController = @Controller + @ResponseBody
	public String getMethodName(@RequestParam(name="code") String code) {
		System.out.println("code : "+code);
		
		// POST - 카카오 토큰 요청 받기
		// header, body 구성
		RestTemplate rt1 = new RestTemplate();
		
		// 헤더 구성
		HttpHeaders header1 = new HttpHeaders();
		header1.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
		
		// 바디 구성
		MultiValueMap<String, String> params1 = new LinkedMultiValueMap<String,String>();
		params1.add("grant_type", "authorization_code");
		params1.add("client_id", "e6c387d854fa01be9131e377baa4686f");
		params1.add("redirect_uri", "http://localhost:8080/user/kakao");
		params1.add("code", code);
		
		// 헤더+바디 결합
		HttpEntity<MultiValueMap<String,String>> reqKakaoMessage
			= new HttpEntity<>(params1,header1);
			
		// 통신 요청
		ResponseEntity<OAuthToken> response1= rt1.exchange("https://kauth.kakao.com/oauth/token", 
				HttpMethod.POST, reqKakaoMessage, OAuthToken.class);		
		System.out.println("response : "+response1.getBody().toString());
		
		// 카카오 리소스서버 사용자 정보 가져오기
		RestTemplate rt2=new RestTemplate();
		
		// 헤더
		HttpHeaders headers2=new HttpHeaders();
		// 반드시 Bearer 값 다음에 공백 한 칸 추가할 것
		headers2.add("Authorization","Bearer "+response1.getBody().getAccessToken());
		headers2.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
		// 본문(BODY) x
		
		// HTTP ENTITY 만들기
		HttpEntity<MultiValueMap<String, String>> reqKakaoInfoMessage = new HttpEntity<>(headers2);
		
		// 통신 요청
		ResponseEntity<KakaoProfile> response2=
				rt2.exchange("https://kapi.kakao.com/v2/user/me", HttpMethod.POST,
				reqKakaoInfoMessage, KakaoProfile.class);
		
		KakaoProfile kakaoProfile= response2.getBody();
		// -----카카오 사용자 정보 응답 완료-----
		
		// 최초 사용자라면 자동 회원 가입 처리 (우리 서버)
		// 회원가입 이력이 있는 사용자라면 바로 세선처리(우리 서버)
		// 사전기반 --> 소셜 사용자는 비밀번호를 입력하는가? 안 하는가?
		// 우리 서버에 회원가입시에 --> password --> not null (무조건 만들어 넣어야 함. DB 정책)
		
		
		// 1. 회원가입 데이터 생성
		SignUpDTO signUpDTO = SignUpDTO.builder()
				.username(kakaoProfile.getProperties().getNickname()+"_"+kakaoProfile.getId())
				.fullname("OAuth_"+kakaoProfile.getProperties().getNickname())
				.password("07f5efbd3004db57fcd53846050461b203e984faa9d957285aa26f8b")
				.build();
		
		// 2. 우리 사이트 최초 소셜 사용자인지 판별
		User oldUser=userService.searchUsername(signUpDTO.getUsername());
		if(oldUser == null) {
			// 사용자가 최초 소셜 로그인 사용자임!
			userService.createUser(signUpDTO);
			// 고민 !!!
		}
		
		return response2.getBody().toString();
	}

 

 

2. 카카오 프로필과 연동 - 이미지 받아오기

	public String setUpUserImage() {
		if(uploadFileName==null && originFileName==null) {
			uploadFileName="https://picsum.photos/id/1/350";
		} else if(fullname.contains("OAuth")) {
			uploadFileName=this.getOriginFileName();
		} else {
			uploadFileName = "/images/uploads/" +uploadFileName;
		}
		
		return uploadFileName;
	}
728x90
반응형