구글 로그인을 해봤으니 페이스북 로그인은 쉽게 할 수 있다.
기본적인 구조는 구글 로그인과 똑같다.
facebook api 콘솔에서 앱 만들기.
application.yml 수정
구글과 페이스북 로그인 구분
다음과 같은 순서를 통해서 진행해 보도록 하겠다.
먼저 facebook api 콘솔 사이트에 접속한다.
https://developers.facebook.com/?locale=ko_KR
그럼 다음과 같은 화면이 뜰 것이다. 로그인을 안했다면 로그인을 해준다.
그 다음 내 앱 > 앱 만들기 > 소비자 > 앱 ID 적어주기 > facebook 로그인 설정 > 사이트 url (http://localhost:8080) 을 적어주면 앱이 생성된다.
그럼 다음과 같은 화면이 나올 것이다.
이제 모든 준비는 완료되었으니 코드를 수정해 보겠다.
security:
oauth2:
client:
registration:
google:
client-id: /**자신의 클라이언트 아이디**/
client-secret: /**자신의 클라이언트 비밀번호**/
scope: profile,email
facebook:
client-id: /**자신의 클라이언트 아이디**/
client-secret: /**자신의 클라이언트 비밀번호**/
scope: public_profile,email
이전에 구글로그인을 구현할 때에 attributes에서 sub라는 타이틀을 가져온적이 있다.
하지만 페이스북에서는 sub가 아닌 id를 받아와야 한다.
따라서 provider를 구분하기 위해서 인터페이스와 클래스를 생성하기로 한다.
public interface OAuth2UserInfo {
String getProviderId();
String getProvider();
String getEmail();
String getName();
}
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");
}
}
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를 받는 방식이다.
이제 이것을 이용해서 로그인시 서로 구분되서 로그인이 실행되어야 한다.
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";