MakerHyeon

[SpringBoot] Security 페이스북 로그인 (security facebook login) 본문

SpringBoot/Security

[SpringBoot] Security 페이스북 로그인 (security facebook login)

유쾌한고등어 2023. 1. 23. 14:26

● Security 페이스북 로그인 (security facebook login)

 

페이스북 API 콘솔 바로가기


- loginForm.html에 페이스북 로그인 UI추가

<a href="/oauth2/authorization/google">구글 로그인</a>
<a href="/oauth2/authorization/facebook">페이스북 로그인</a>
<a href="/joinForm">회원가입을 아직 하지 않으셨나요?</a>

 

- application.yml 에 아이디,시크릿키 추가


facebook:
  client-id: 57755337384710656
  client-secret: 6c474e4db28a061ad83cf137c8a9e95e56
  scope:
    - email
    - public_profile

 

- 구글 , 페이스북 로그인 분리 구현을 위해 OAuth2UserInfo interface 생성

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

 

- GoogleUserInfo 파일 생성

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

 

- FacebookUserInfo 파일 생성

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

    }
}

 

- 구글,페이스북 loadUser 분리구현

// PrincipalOauth2UserService의 loadUser함수

OAuth2User oAuth2User = super.loadUser(userRequest);
// oAuth2User =oAuth2User.getAttributes();

// 회원가입 진행
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 = userRequest.getClientRegistration().getRegistrationId();
//        String providerId = oAuth2User.getAttribute("sub");
//        String username = provider+"-"+providerId; // google_103234234234534543534
//        String password = bCryptPasswordEncoder.encode("겟인데어");
//        String email = oAuth2User.getAttribute("email");
//        String role = "ROLE_USER";

String provider = oAuth2UserInfo.getProvider(); // google
String providerId = oAuth2UserInfo.getProviderId();
String username = provider+"-"+providerId; // google_103234234234534543534
String password = bCryptPasswordEncoder.encode("겟인데어");
String email = oAuth2User.getAttribute("email");
String role = "ROLE_USER";


User userEntity = userRepository.findByUsername(username);
if(userEntity == null){        // 이미 회원가입이 되어있을때 에러
    userEntity = User.builder()
            .username(username)
            .password(password)
            .email(email)
            .role(role)
            .provider(provider)
            .providerId(providerId)
            .build();
    userRepository.save(userEntity);
}else{
    System.out.println("로그인을 이미 한 적이 있습니다.");
}
return new PrincipalDetails(userEntity,oAuth2User.getAttributes());
Comments