Spring boot kim's cafe/oauth로그인

Springboot 네이버로그인!(3) 완료 with Authentication ,AuthenticationManager,SecurityCont

디비드킴 2021. 7. 10. 22:03

이제 로그인 요청이 완료된 거니
토큰으로 회원정보를 가져와야 한다

개발자센터를 보면
https://developers.naver.com/docs/login/profile/profile.md

 

네이버 회원 프로필 조회 API 명세 - LOGIN

네이버 회원 프로필 조회 API 명세 NAVER Developers - 네이버아이디로로그인 회원 프로필 조회 가이드 네이버 로그인을 통해 인증받은 받고 정보 제공에 동의한 회원에 대해 회원 메일 주소, 별명, 프

developers.naver.com

https://openapi.naver.com/v1/nid/me


경로로 헤더에는
Authorization: Bearer AAAAOLtP40eH6P5S4Z4FpFl77n3FD5I+W3ost3oDZq/nbcS+7MAYXwXbT3Y7Ib3dnvcqHkcK0e5/rw6ajF7S/QlJAgUukpp1OGkG0vzi16hcRNYX6RcQ6kPxB0oAvqfUPJiJw==

이런 식으로 해줘야 했다
coolsms에서 봤던 건데
도대체 무슨 형식의 헤더인지
모르겠어서
그냥 지정을 안 하고
headers.add("Authorization", "Bearer "+jsonObject.get("access_token"));
예제 그대로 해서 보내봤다

dto

naverDto.java


service

naverLoingService.java

그랬더니 띠용??
성공적으로 왔다

실제 정보여서 일부만 공개합니다

어 이러면 coolsms도
다시 시도해봐야겠다

어쨌든
근데 웃긴 게
언제 가입된지도 기억도 안 나지만
---.yahoo.co.kr로 이메일이 나온다
너무 옛날에 가입해서
저렇게 가지고 있나 보다
그래서
String email=(String)naverDto.getResponse().get("email");
String[] email2=email.split("@");
if(!email2[1].equals("naver.com")){
email=email2[0]+"@naver.com";
}
체크해서 db에 저장될 때는
---@naver.com으로 들어가게
로직을 만들어 줬다 그다음

 

++추가 20210803

네이버는 이메일을 주는게 아니라

연락처 이메일을 준다

 

네이버 내정보를 보면

이 메일을 주는거다 확인해보니

yahoo.co.kr로 되어 있는데 

그래서 사진 처럼 현재 사용 이메일로 재인증 했다

새로 하나 알았다...

위에 로직은 이제 삭제 해주자

이제 로그인 처리를 해줘야 한다
AuthenticationManager를 사용해줘야 하는데
@Autowired
private AuthenticationManager authenticationManager;
해도 안될 수가 있다 이럴 땐

security

security.java

시큐리티에 직접 오버라이드 해줘야 한다
처음 보는 오류였다

service

naverLoingService.java


그다음
Authentication객체를
authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(email, pwd));
이용해서 만들어준다 여기서 주의할 점
pwd는 절대 노출되면 안 된다
그리고 같은 번호를 넣어야 한다

이유는
로그인도 여기로 온다 그렇다면
SecurityContextHolder.getContext().setAuthentication(authentication);
시큐리티가 검증을 하는데 db에 들어가서 select문을 날려보기 때문이다

만약 회원가입 시에 1111이라고 해놓고
갑자기 로그인할 때는 2222라고 하면?
oauth로그인에 실패한다

그래서 절대 노출되면 안 되고
잘 관리해야 한다

또 하나 해줘야 한다
첫 oauth로그인 시도 후
시큐리티가 select 문을 던졌던데
db에 없다면?
역시 실패한다
if(userservice.confrimEmail(email)==false){
userdto userdto=new userdto();
userdto.setEmail(email);
userdto.setName((String)naverDto.getResponse().get("name"));
userdto.setPwd(pwd);
userservice.insertUser(userdto);
}
이메일이 존재하는지 안 하는지 검사
if(userservice.confrimEmail(email)==false)
존재하지 않다면 회원가입 진행

처음이라면 꼭 회원가입을 해줘야 한다
안 그러면 검증에 실패했다는 오류를 본다
이걸로 한 시간 날렸다
왜 안되지 하고 보다가
응? select문을 날리네?
발견하고 회원가입 로직을 대충 만들고
테스트해봤더니 됐다

결과

db저장됨

 

시큐리티 로그인 검증 

로그인에 성공했다!
또 하나의 api 성공!

후 소스가 많이 더러워졌다 역시 정리하러 가자!

+추가

vo
@AllArgsConstructor
추가해준다

uservo.java


service

userservice.java
naverLoingService.java

좀 더 심플해졌다!
아 저것도 utillservice.java로 빼주자

naverLoingService.java

이제 다른 부분들도
정리하러 가자!

 

+추가

controller

controller.java

끝난뒤 꼭 리다이렉트를 해주자

return "redirect:/";