유튜브에서 스프링시큐리티를 심화교육하면서 조금더 레벨업 하고자 한다.
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 로그인을 사용하기 때문에 이전 글에서 사용했던 서비스단에서 값을 그냥 넣어주는
방식으로는 한계가 있다.
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로그인시 자동으로 회원가입이 잘되는걸 확인 할 수 있다.
'프로젝트 > SpringSecurity' 카테고리의 다른 글
[Spring Security] 10. JWT를 이용하기위한 security 설정 (0) | 2023.07.11 |
---|---|
[Spring Security] 9. OAuth 네이버로그인 (0) | 2023.07.07 |
[Spring Security] 7. OAuth 구글로그인(4) (0) | 2023.07.05 |
[Spring Security] 6. OAuth 구글로그인(3) (0) | 2023.07.05 |
[Spring Security] 5. OAuth 구글로그인(2) (0) | 2023.07.04 |
댓글