https://developers.facebook.com/
Meta for Developers
꿈의 아틀리에 창조 BUCK의 크리에이터와 개발자로부터 Meta Spark를 사용하여 DIOR Beauty를 위한 AR 경험을 설계 및 빌드하는 과정에 대한 비하인드 스토리를 들어보세요. 이제 고급 액세스에 대한 비
developers.facebook.com
로그인하고 내 앱 클릭







application.properties
spring.security.oauth2.client.registration.facebook.client-id=클라이언트ID
spring.security.oauth2.client.registration.facebook.client-secret=앱 시크릿 코드
spring.security.oauth2.client.registration.facebook.scope=email,public_profile
(만약 oauth 별도 프로필을 만들었다면 그곳에 추가한다.)
scope
https://developers.facebook.com/docs/facebook-login/web/
웹 - Facebook 로그인 - 문서 - Meta for Developers
전체 코드 예시 이 코드는 HTML 페이지에 JavaScript SDK를 읽어들여 초기화합니다. {app-id}를 앱 ID로 바꾸고, {api-version}을 사용할 그래프 API 버전으로 바꿉니다. 이전 버전을 사용해야 할 특별한 이유
developers.facebook.com

loginForm.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>로그인 페이지</title>
</head>
<body>
<h1>로그인 페이지</h1>
<hr>
<form action="/login" method="post">
<input type="text" name="username" placeholder="Username"><br>
<input type="password" name="password" placeholder="Password">
<button>로그인</button>
</form>
<a href="/oauth2/authorization/google">구글 로그인</a>
<a href="/oauth2/authorization/facebook">페이스북 로그인</a>
<a href="/joinForm">회원가입을 아직 하지 않으셨나요?</a>
</body>
</html>





DB를 확인해 보면

null이 있다.
String providerId = oAuth2User.getAttribute("sub");
왜냐하면 구글은 sub인데 페이스북은 id이기 때문이다. 이렇게 두 서비스에서 속성명이 다르면 loadUser()를 같이 쓸 수 없다.
속성명과 관계없이 loadUser()를 사용하기 위해 인터페이스를 하나 만들 것이다.

package com.cos.security.config.oauth.provider;
public interface OAuth2UserInfo {
String getProviderId();
String getProvider();
String getEmail();
String getName();
}
그리고 GoogleUserInfo 클래스를 만든다.
package com.cos.security.config.oauth.provider;
import lombok.RequiredArgsConstructor;
import java.util.Map;
@RequiredArgsConstructor
public class GoogleUserInfo implements OAuth2UserInfo{
private final Map<String, Object> attributes; // oauth2User.getAttributes()
@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도 만든다.
package com.cos.security.config.oauth.provider;
import lombok.RequiredArgsConstructor;
import java.util.Map;
@RequiredArgsConstructor
public class FacebookUserInfo implements OAuth2UserInfo{
private final Map<String, Object> attributes; // oauth2User.getAttributes()
@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
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
System.out.println("getClientRegistration : " + userRequest.getClientRegistration()); // registrationId로 어떤 OAuth로 로그인 했는지 확인 가능
System.out.println("getTokenValue : " + userRequest.getAccessToken().getTokenValue());
OAuth2User oAuth2User = super.loadUser(userRequest);
// 구글 로그인 버튼 클릭 -> 구글 로그인 창 -> 로그인 완료 -> code를 리턴(OAuth-Client라이브러리) -> AccessToken 요청
// userRequest 정보 -> loadUser함수 -> 구글로부터 회원프로필 받아준다.
System.out.println("getAttribute : " + oAuth2User.getAttributes());
// 회원가입을 강제로 진행
OAuth2UserInfo oAuth2UserInfo = null;
if (userRequest.getClientRegistration().getRegistrationId().equals("google")) {
System.out.println("구글 로그인 요청");
oAuth2UserInfo = new GoogleUserInfo(oAuth2User.getAttributes());
}
if (userRequest.getClientRegistration().getRegistrationId().equals("facebook")) {
System.out.println("페이스북 로그인 요청");
oAuth2UserInfo = new FacebookUserInfo(oAuth2User.getAttributes());
}
String provider = oAuth2UserInfo.getProvider();
String providerId = oAuth2UserInfo.getProviderId();
String username = provider + "_" + providerId;
String password = bCryptPasswordEncoder.encode("아무거나");
String email = oAuth2UserInfo.getEmail();
String role = "ROLE_USER";
기존의 db 데이터를 지우고 다시 로그인하면

일반 로그인인지 소셜 로그인인지 구분은

provider가 null이냐 아니냐로 할 수 있다.
'Spring Security' 카테고리의 다른 글
| [웹 보안] 세션 (0) | 2023.03.27 |
|---|---|
| [OAuth] 네이버 로그인 (0) | 2023.03.27 |
| [OAuth] 구글 로그인 및 자동 회원가입 진행 완료 (0) | 2023.03.26 |
| [OAuth] Authentication객체가 가질 수 있는 2가지 타입 (0) | 2023.03.26 |
| [OAuth] 구글 회원 프로필 정보 받아보기 (0) | 2023.03.26 |