https://developers.facebook.com/?locale=ko_KR
위 사이트에 들어가서 로그인을 한다.
로그인하면 상단 해더에 '내 앱'이라는 카테고리가 있는데 거기로 들어가서 앱을 아래와 같이 만든다.
시작하기 전에 기본적인 oauth로그인에 대한 코드나 내용은 이전 포스팅인 구글로그인편을 해 보고 오셔야 해당 포스팅을 이해하실 수 있습니다.
앱을 만들고 로그인 기능을 추가한 다음 설정으로 가면 아래와 같은 앱 id와 시크릿코드가 나오는데 이제 이 코드를 yml로 가서 설정해준다.
밑에 public_profile이라고 한 이유는 문서에그렇게 나와있기때문. 그래서 아무렇게나 설정하면 안 된다.
이제 로그인 설정을 해보자
loginForm으로 가서 경로 설정을 해준다.
위 경로로 해주면 되는데 이와 같은 경로로 설정을 해줘야 하는 이유는 oauth2 client라이브러리를 사용하면 위와 같은 형식의 경로가 고정으로 설정돼 있기 때문이다.
이제 내 서버로 가서 페이스북 로그인을 클릭을 하면 아래와 같이 페이스북 로그인이 잘 실행된다.
그럼 구글 로그인을 테스트할 때 만들어놓은 로그들을 보고 사용해서 데이터형 식이 어떻게 되는지 먼저 체크해본다.
Attributes를 보면 아이디 이름 이메일 이렇게 새게를 준다. 그럼 db에 자동 회원가입을 시키는 로직을 보면
우리가 구글 로그인을 할 때 id값을 가져오기 위해 'sub'라는 attributes값을 요청했다. 하지만 페이스북에서 id값은 'id'로 받아야 하기 때문에 분기를 시켜줘야 한다.
그래서 위와 같이 작성을 하면 나중에 유지보수를 하거나 할 때 굉장히 복잡해 지기 때문에 providerId값을 따로 관리하는 것이 효과적이다. 그래서 코드를 리 펙터 링 해줄 거다
인터페이스를 만들어주고
위인 터페이스를 상속받아서 구글과 페이스북을 분기시켜서 유지보수나 관리하기 효율적으로 만들어 줄 것이다.
그럼 이제 loadUser함수로 가서 아래와 같이 분기시켜주면 된다.
그러면 이제 이렇게 설계를 해나가면 다른 oauth로그인(네이버라던지)이 와도 이런 식으로 편리하게 분기시킨 후에 oAuth2 Userinfo라는 객체로 oauth로그인과 자동 회원가입을 시킬 수 있도록 되는 것이다.
이렇게 하면 최소한의 수정으로 oauth로그인을 분기시켜서 관리할 수 있다.
그럼 이제 잘 되는지 테스트해본다.
직이 주게 잘된다.
너무 좋다.
행복하고 아름답다....
리 펙터 링을 이렇게 하면 나중에 네이버 로그인을 추가하거나, 카카 카오 로그인을 추가하거나 할 때 즉 다른 oauth2 로그인을 할 때도 그냥 해당 oauth로그인을 관리하는 클래스만 만들어주면 위 코드는 수정하지 않고 그대로 사용할 수 있기 때문에 유지 보수하기가 굉장히 좋다.
그리고 하나 더 좋은 점이 있다면 일반 로그인 시에는 provider(google, facebook) 값이 없기 때문에 나중에 사용자가 일반 로그인을 했는지 아니면 oauth로그인을 했는지 체크할 때는 provider값이 null인지 아닌지만 체크해주면 되는 것이다.
다음에도 이런 분기 나눠야 하는 상황에서 단순이 if문만 사용해서 해결하려 하는 것이 아닌 좀 더 객체지향적인 접근이 필요하다는 것을 알게 됐다.
깃주소
https://github.com/fj2008/SpringbootSecurity
'SpringbootSecurity' 카테고리의 다른 글
SpringbootSecurity/JWT기본개념(세션에 고질적인 문제) (0) | 2021.09.02 |
---|---|
SpringbootSecurity/Springboot로 네이버 로그인 해보기 (yml에서 provider 설정하기) (0) | 2021.09.01 |
SpringbootSecurity/Springboot로 구글로그인 해보기(3)/구글 로그인 및 자동 회원가입 진행 완료 (0) | 2021.08.29 |
SpringbootSecurity/Springboot로 구글로그인 해보기(3)/Authentication객체가 가질 수 있는 2가지 타입 (0) | 2021.08.29 |
SpringbootSecurity/Springboot로 구글로그인 해보기(2)/구글 회원 프로필 정보 (0) | 2021.08.29 |