Search
Duplicate
📒

[Spring Security] 02-3. Facebook Login

상태
미진행
수업
Spring Security
주제
Security
4 more properties
참고

OAuth2 페이스북 로그인

application.yml

NOTE
security: oauth2: client: registration: google: client-id: /**자신의 클라이언트 아이디**/ client-secret: /**자신의 클라이언트 비밀번호**/ scope: profile,email facebook: client-id: /**자신의 클라이언트 아이디**/ client-secret: /**자신의 클라이언트 비밀번호**/ scope: public_profile,email
YAML
복사
기존의 구글 로그인과 똑같이 구성되어 있다.
만들어진 앱에서 client-id/secret를 받아서 적어준다.
scope는 google과 다르게 public_profile로 적어주어야 한다.
사이트마다 scope값이 다르기 때문에 주의할것!

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

NOTE
이전에 구글 로그인을 구현할 떄에 attributes에서 sub라는 타이틀을 가져온적이 있다. 하지만 페이스북에서는 sub가 아닌 id를 받아와야하는데 어떻게 해결하는가?
provider를 구분하기 위해서 인터페이스와 클래스를 생성하기로 한다!

OAuth2UserInfo.interface

NOTE
public interface OAuth2UserInfo { String getProviderId(); String getProvider(); String getEmail(); String getName(); }
Java
복사
provier와 providerId, 이메일, 이름을 반환하는 공통 메서드를 구현한다.

GoogleUserInfo, FacebookUserInfo

NOTE

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"); } }
Java
복사
providerId를 sub로 받아옴!

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"); } }
Java
복사
providerId를 id로 받아옴!

PrincipalOauth2UserService

NOTE
// 회원가입을 강제로 진행할 예정 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()); } else{ System.out.println("구글하고 페이스북, 네이버 로그인이 없다고요? 나가"); } String provider = oAuth2UserInfo.getProvider();// google String providerId = oAuth2UserInfo.getProviderId(); String username = oAuth2UserInfo + "_" + providerId; String password = "겟인데어"; String email = oAuth2User.getAttribute("email"); String role = "ROLE_USER";
Java
복사
인터페이스를 통해서 구글과, 페이스북 둘다 쉽게 정보를 받아올 수 있게했다.
이제 이 정보를 활용해서 로그인이 실행되게 하면된다!
User userEntity = userRepository.findByUsername(username); if (userEntity == null) { // 유저가 없으므로 강제로 회원가입 시킴 userEntity = User.builder() .username(username) .password(password) .email(email) .role(role) .provider(provider) .providerId(providerId) .build(); System.out.println("userEntity = " + userEntity); userRepository.save(userEntity); }else{ System.out.println("이미 로그인한적이 있습니다!"); }
Java
복사