사용자가 애플리케이션에게 모든 권한을 넘기지 않고 사용자 대신 서비스를 이용할 수 있게 해주는 HTTP 기반의 보안 프로토콜
//카카오 api 키 등록
Kakao.init('150169fab72c4abb733d5ccf61c4ac70');
function kakao_login() {
Kakao.Auth.login({
success: function(authObj) {
$.ajax({
type: 'POST',
url: `/login/kakao`,
contentType: "application/json",
data: JSON.stringify({'token':authObj['access_token']}),
success: function (response) {
localStorage.setItem("token", response['token']);
localStorage.setItem("username", response['username']);
location.href = '/';
}
})
},
fail: function(err) {
alert(JSON.stringify(err))
},
})
}
@PostMapping(value = "/login/kakao")
public ResponseEntity<?> createAuthenticationTokenByKakao(@RequestBody SocialLoginDto socialLoginDto) throws Exception {
//api 인증을 통해 얻어온 code값 받아오기
String username = userService.kakaoLogin(socialLoginDto.getToken());
final UserDetails userDetails = userDetailsService.loadUserByUsername(username);
final String token = jwtTokenUtil.generateToken(userDetails);
return ResponseEntity.ok(new JwtResponse(token, userDetails.getUsername()));
}
public String kakaoLogin(String token) {
// 카카오 OAuth2 를 통해 카카오 사용자 정보 조회
KakaoUserInfo userInfo = kakaoOAuth2.getUserInfo(token);
Long kakaoId = userInfo.getId();
String nickname = userInfo.getNickname();
String email = userInfo.getEmail();
// 카카오 로그인 토큰은 email 과 password 로 만들어줌
String username = email;
// 패스워드 = 카카오 Id + ADMIN TOKEN
String password = kakaoId + ADMIN_TOKEN;
// DB 에 중복된 Kakao Id 가 있는지 확인
User kakaoUser = userRepository.findByKakaoId(kakaoId)
.orElse(null);
// 카카오 정보로 회원가입
if (kakaoUser == null) {
// 패스워드 인코딩
String encodedPassword = passwordEncoder.encode(password);
// ROLE = 사용자
kakaoUser = new User(username, encodedPassword, nickname, kakaoId);
userRepository.save(kakaoUser);
}
// 로그인 처리
Authentication kakaoUsernamePassword = new UsernamePasswordAuthenticationToken(username, password);
// public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 로 진행됨
Authentication authentication = authenticationManager.authenticate(kakaoUsernamePassword);
SecurityContextHolder.getContext().setAuthentication(authentication);
return username;
}
Authentication kakaoUsernamePassword = new UsernamePasswordAuthenticationToken(username, password);
이 코드는 아래의 코드로 진행된다
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("로그인 오류"));
return new UserDetailsImpl(user);
}
안녕하세요 수영님.
DB저장 하는부분 좀 더 알아보고싶은데 깃허브 코드 공유 가능할까요 ??