[Security] 시큐리티 프로젝트 로그인 - OAuth 로그인_naver
https://oneseok.tistory.com/64
[Security] 시큐리티 프로젝트 로그인 - OAuth 로그인_google
https://oneseok.tistory.com/63 [Security] 시큐리티 프로젝트 로그인 - 회원가입 및 기본로그인 https://oneseok.tistory.com/62 [Security] 시큐리티 프로젝트 로그인 - Security 설정 클래스 파일 생성 https:..
oneseok.tistory.com
지난 시간에는 google 로그인을 해보며 OAuth-Client 라이브러리를 이용해 보았다.
이로써 흐름은 파악을 했고 이번시간에는 google 과 달리 provider를 제공하지 않는 naver의 경우 어떻게 처리하는지 알아 볼 것이다.
1. application.yml 설정 추가
- naver의 경우 provider를 제공하지 않기때문에 내가 직접 만들어 줘야한다.
- provider의 내용들은 모두 네이버 개발자센터에서 로그인부분 문서를 보면 나와있다!!...
- 추가로 네이버의 경우 provider가 없으니 redirect-url 역시 내 마음데로 설정 가능하다.
(대신 개발자센터에서 설정한 걸로 똑같히 해야겟지 ?? )
- 네이버의 경우 회원정보가 response 라는 키값 안에 들어있다고 한다.

2. 네이버 로그인 버튼 추가 및 로그인
- loginForm.html 파일에 로그인 버튼을 추가하자
- "/oauth2/authorization/naver 를 클릭하면 yml에 설정한 authorization-uri에 연결된다.
전시간에 기억이 날지 모르겠지만
"/oauth2/authorization/google" 주소를 들어가면 provider가 제공하는 "authorization-uri" 로 연결이 된다!!
라고 말한 부분이 있다.
여기서 authorization-uri 는 yml에 설정한 네이버 provider에 있는 authorization-uri 부분이랑 같은 부분을 말한다.

- 로그인 결과를 보자
- 결과를 보니 정보가 null값이 들어왔다 왜냐하면 네이버의 경우 회원정보가 "response" 라는 값 안에 있기 때문이다.
- 그래서 response로 접근해야하는데 문제는 구글은 지금 상태 그대로 값을 받아 정상처리 할 수 있지만 네이버는 그러지 못한다는 것이다. 그래서 각각에 OAuth 주체에 맞게 로그인 처리를 위해 공통 인터페이스를 만들고 구현 클래스를 OAuth 주체마다 만들것이다.


3. OAuth 로그인에 필요한 공통메소드를 들고있는 인터페이스 만들기
- oauth 패키지 안에 provider 라는 패키지를 만들고 그 안에 인터페이스를 만들자


- 같은 패키지 구조안에 구글 , 네이버 구현 클래스를 만들자

- 먼저 구글 로그인 관련 구현 클래스의 내용이다.
- 구글의 회원정보는 attributes 로 받아 처리하면 되기 때문에 사진과 같이 만들면 된다.

- 네이버도 구글과 형태는 비슷하지만 생성자로 부터 값을 주입 받을때 response가 들어있는 값을 주입받으면된다.

- 마지막으로 "PrincipalOauth2UserService" 내용을 이렇게 수정해야한다.
- getRegistrationId()로 OAuth의 주체가 누구인지 판단한 후 각각에 맞게 구현 클래스안에 필요한 정보를 주입해준다.
구글의 경우 getAttributes()로 주입하면 되고 네이버는 response값을 넘겨주기 위해 get("response")로 한단계 더 들어가서 넘겨주어야한다.

- 로그인 이후 DB 내용을 보면 정상적으로 저장되어 있는걸 확인 할 수있다.

로그인은 여기서 마치고 다음시간에는 일반 로그인과 OAuth 로그인 유저의 인증처리를 통합할 것이다.
일반로그인의 경우 UserDetails를 상속받은 PrincipalDetails 라는 클래스를 Authentication 객체에 담는식으로 하고있는데
현재까지 OAuth 로그인의 경우 그렇치 못하고 있다. 그래서 PrincipalOAuth2UserService에서도 PrincipalDetails 객체를 생성히여 Authentication 객체에 담는식으로 바꿀것이다.