본문 바로가기
프로젝트/SpringSecurity

[Spring Security] 8. OAuth 페이스북로그인

by dantriss 2023. 7. 6.

유튜브에서 스프링시큐리티를 심화교육하면서 조금더 레벨업 하고자 한다.

IDE : IntelliJ

언어 : Java 8

스프링부트 버전 : 2.7.13

DB : MySQL

빌드관리 도구 : Maven

OS : iOS

참고유튜브 : 메타코딩


구글 로그인에 이어서 페이스북 로그인을 진행해보자

페이스북 개발자센터로 이동해서 로그인을 해준다.

https://developers.facebook.com/

 

내앱 -> 앱 만들기를 클릭해준다.

앱 만들기에서 기타를 선택한구 다음

 

앱 유형은 없음 선택

 

앱이름 추가하고 이메일은 선택한 후 앱 만들기 선택

 

facebook 로그인 선택 후 설정

 

웹 선택

 

url 주소에 http://localhost:postnumber 입력 후 저장

 

이후 설정-> 기본설정으로 이동 하면 앱 ID와 비밀번호를 확인할 수 있다.

application.yml에 입력해줘야하니 해당 페이지를 유지하거나 따로 메모장에 붙여넣기를 해놓는다.

 

application.yml로 이동해서 아이디와 비밀번호를 입력해준다.

scope는 구글로그인할때와는 다르게 email 과 public_profile이다 (구글은 email과 profile)

 

이 두개가 다른 이유는 당연하게도 데이터를 넘겨주는 측에서 컬럼명을 저렇게 설정했기 때문이다.

페이스북 문서에서 확인해볼 수 있다.

https://developers.facebook.com/docs/facebook-login/web/permissions

 

LoginForm으로 이동해서 facebook으로 로그인을 a태그로 추가한다.

 

구글과 페이스북 2가지의 OAuth 로그인을 사용하기 때문에 이전 글에서 사용했던 서비스단에서 값을 그냥 넣어주는

방식으로는 한계가 있다.

페이스북 회원의 고유번호 컬럼 id
PrincipalOauth2UserService에서 providerId는 구글의 회원 고유번호 컬럼 sub으로 하였기 때문에 페이스북인 id는 인식을 못함
db에서 확인해보면 facebook의 속성값에는 sub이 없어서 providerId의 값이 Null로 들어간 모습

 

oauth패키지 하위로 provider 패키지를 생성한 뒤 OAuth2UserInfo 인터페이스와 GoogleUserInfo 클래스를 생성해준다.

 

OAuth2UserInfo에 다음과 같이 작성해준다.

public interface OAuth2UserInfo {
    String getProviderId();
    String getProvider();
    String getEmail();
    String getName();
}

 

GoogleUserInfo클래스로 이동해서 OAuth2UserInfo 를 상속받은 후

 

오버라이딩을 해준다.  (단축키 윈도우/맥 : ctrl+o)

 

기본 생성자도 추가해주고 해당 속성들을 Map 타입에 파라메터로 받아준다.

그 후 각각의 값들을 넣어준다.

providerId -> attributes에서 sub이름을 가진 값을 받아서 리턴

provider -> google 로그인 이니깐 google 고정리턴

email -> attributes에서 email 이름을 가진 값을 받아서 리턴

name -> attributes에서 name 이름을 가진 값을 받아서 리턴

public class GoogleUserInfo implements OAuth2UserInfo{

    private Map<String, Object> attributes;

    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");
    }
}

 

GoogleUserInfo를 복사해서 FaceBookUserInfo클래스를 추가로 더 생성해준다.

providerId와 provider만 각각 id 와 facebook으로 변경해주면 된다.

public class FacebookUserInfo implements OAuth2UserInfo{

    private Map<String, Object> attributes;

    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");
    }
}

 

PrincipalOauth2UserService로 이동해서 구글로그인일 때와 페이스북 로그인일때를 if문으로 구분해서 방금 만든

클래스들을 불러와 다른 속성값을 부여해준다.

OAuth2UserInfo oAuth2UserInfo = null;
if(userRequest.getClientRegistration().getRegistrationId().equals("google")){
    oAuth2UserInfo = new GoogleUserInfo(oAuth2User.getAttributes());
} else if (userRequest.getClientRegistration().getRegistrationId().equals("facebook")) {
    oAuth2UserInfo = new FacebookUserInfo(oAuth2User.getAttributes());

}

String provider = oAuth2UserInfo.getProvider();
String providerId = oAuth2UserInfo.getProviderId();
String username = provider+"_"+providerId;
String password = bCryptPasswordEncoder.encode("1111");
String email = oAuth2UserInfo.getEmail();
String role = "ROLE_USER";

 

저번글에서 로그인한 유저의 정보를 확인해보기 위해서 각각 로그인 후 /User로 접근해서 콘솔에 찍히는 내용을 확인해보면

각각 구글, 페이스북, 일반로그인회원을 구분할 수 있는것을 확인할 수 있다.

 

db에도 각각 provider와 providerId 또 회원 아이디까지 OAuth로그인시 자동으로 회원가입이 잘되는걸 확인 할 수 있다.

댓글