[Spring Security] 7. OAuth2 Facebook Login

개발자·2022년 5월 11일
0

Spring Security

목록 보기
7/11
post-thumbnail

OAuth2 페이스북 로그인

구글 로그인을 해봤으니 페이스북 로그인은 쉽게 할 수 있다.

기본적인 구조는 구글 로그인과 똑같다.

  1. facebook api 콘솔에서 앱 만들기.

  2. application.yml 수정

  3. 구글과 페이스북 로그인 구분

다음과 같은 순서를 통해서 진행해 보도록 하겠다.

facebook api 콘솔 앱 생성

먼저 facebook api 콘솔 사이트에 접속한다.
https://developers.facebook.com/?locale=ko_KR

그럼 다음과 같은 화면이 뜰 것이다. 로그인을 안했다면 로그인을 해준다.

그 다음 내 앱 > 앱 만들기 > 소비자 > 앱 ID 적어주기 > facebook 로그인 설정 > 사이트 url (http://localhost:8080) 을 적어주면 앱이 생성된다.

그럼 다음과 같은 화면이 나올 것이다.

이제 모든 준비는 완료되었으니 코드를 수정해 보겠다.

application.yml

security:
    oauth2:
      client:
        registration:
          google:
            client-id: /**자신의 클라이언트 아이디**/
            client-secret: /**자신의 클라이언트 비밀번호**/
            scope: profile,email

          facebook:
            client-id: /**자신의 클라이언트 아이디**/
            client-secret: /**자신의 클라이언트 비밀번호**/
            scope: public_profile,email
  • 기존의 구글로그인과 똑같이 구성되어 있다.
  • 만들어진 앱에서 client-id/secret을 받아 적어준다,
  • 스코프는 google과 다르게 public_profile로 적어주어야 한다.
    ( 이것은 사이트마다 받는 스코프가 다른것이므로 확인을 해주어야 한다 )

구글과 페이스북 로그인 구분

이전에 구글로그인을 구현할 때에 attributes에서 sub라는 타이틀을 가져온적이 있다.

하지만 페이스북에서는 sub가 아닌 id를 받아와야 한다.

따라서 provider를 구분하기 위해서 인터페이스와 클래스를 생성하기로 한다.

OAuth2UserInfo.interface

public interface OAuth2UserInfo {
    String getProviderId();
    String getProvider();
    String getEmail();
    String getName();
}
  • 다음과 같은 인터페이스를 먼저 생성한다.
  • provider와 providerId, 이메일, 이름을 반환하는 메소드
  • 이제 인터페이스를 구현하는 클래스를 생성할 것이다.

GoogleUserInfo

public class GoogleUserInfo implements OAuth2UserInfo{

    private Map<String,Object> attributes; // getAttributes;

    // 생성자
    public GoogleUserInfo(Map<String,Object> attributes){
        this.attributes = attributes;
    }

    @Override
    public String getProviderId() {
        return (String)attributes.get("sub");
    }

    @Override
    public String getProvider() {
        return "google";
    }

    @Override
    public String getEmail() {
        return (String)attributes.get("email");
    }

    @Override
    public String getName() {
        return (String)attributes.get("name");
    }
}

FacebookUserInfo

public class FacebookUserInfo implements OAuth2UserInfo{
    private Map<String,Object> attributes; // getAttributes;

    // 생성자
    public FacebookUserInfo(Map<String,Object> attributes){
        this.attributes = attributes;
    }

    @Override
    public String getProviderId() {
        return (String)attributes.get("id");
    }

    @Override
    public String getProvider() {
        return "facebook";
    }

    @Override
    public String getEmail() {
        return (String)attributes.get("email");
    }

    @Override
    public String getName() {
        return (String)attributes.get("name");
    }
}
  • 기본적인 구성과 메소드 구현은 모두 같다

  • 다른점은 Provider와 ProviderId를 받는 방식이다.

  • 이제 이것을 이용해서 로그인시 서로 구분되서 로그인이 실행되어야 한다.

PrincipalOauth2UserService

 OAuth2UserInfo oAuth2UserInfo = null;
 
 if(userRequest.getClientRegistration().getRegistrationId().equals("google")){
     System.out.println("구글 로그인 요청");
     oAuth2UserInfo = new GoogleUserInfo(oauth2User.getAttributes());
 }else if(userRequest.getClientRegistration().getRegistrationId().equals("facebook")){
     System.out.println("페이스북 로그인 요청");
     oAuth2UserInfo = new FacebookUserInfo(oauth2User.getAttributes());
  else{
     System.out.println("구글, 페이스북 로그인만 지원합니다.");
 }
 
 String provider = oAuth2UserInfo.getProvider();
 String providerId = oAuth2UserInfo.getProviderId();
 String username = provider+"_"+providerId; 
 String password = "1234";
 String email = oauth2User.getAttribute("email");
 String email = oAuth2UserInfo.getEmail();
 String role = "ROLE_USER";
  • RegistrationId 를 통해 구글 / 페이스북 로그인을 구분하고 서로 다른 클래스를 받도록하여 구성한다.

0개의 댓글