점프 투 스프링부트 추가 기능 구현 아홉번째, 소셜 로그인 기능 구현
구현한 기능
1) 카카오 로그인
2) 구글 로그인
3) 네이버로그인
4) 소셜 로그인 사용자 비번 랜덤 설정 및 변경 메뉴 숨기기
로그인 창
마이페이지 화면
OAuth를 통해 Access Token 얻는 과정을 한번 다시 이해하고 접근하면 이해가 더 잘 갈 것 같습니다.
혹시 그림이 잘 안들어 오시면 과정을 글로 적어둔 포스팅 참고해도 좋을 것 같습니다!
[영상후기] WEB2-OAuth - 생활코딩님 영상
처음에 등록 부분을 하고, 스프링부트 yml에 설정하고, 스프링 시큐리티, oauth-client 의존성을 받으면 중간 과정은 다 해줍니다.
1) oauth2 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
.oauth2Login(
oauth2Login -> oauth2Login
.loginPage("/user/login")
)
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
@Slf4j
public class CustomOAuth2UserService extends DefaultOAuth2UserService {
private final UserService userService;
// 카카오톡 로그인이 성공할 때 마다 이 함수가 실행된다.
@Override
@Transactional
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
// access 토큰으로 user 정보 조회
OAuth2User oAuth2User = super.loadUser(userRequest);
String providerTypeCode = userRequest.getClientRegistration().getRegistrationId().toUpperCase();
String oauthId = switch (providerTypeCode) {
case "NAVER" -> ((Map<String, String>) oAuth2User.getAttributes().get("response")).get("id");
default -> oAuth2User.getName();
};
String username = providerTypeCode + "__%s".formatted(oauthId);
SiteUser siteUser = userService.whenSocialLogin(providerTypeCode, username);
return new CustomOAuth2User(siteUser.getUsername(), siteUser.getPassword(), siteUser.getGrantedAuthorities());
}
}
class CustomOAuth2User extends User implements OAuth2User {
public CustomOAuth2User(String username, String password, Collection<? extends GrantedAuthority> authorities) {
super(username, password, authorities);
}
@Override
public Map<String, Object> getAttributes() {
return null;
}
@Override
public String getName() {
return getUsername();
}
}
private String email;
private String providerTypeCode;
기존 회원가입 방식이면 "SBB" 형태로 가입한 것으로 저장하고, 소셜로그인 방식이면 가입한 경로를 providerTypeCode 변수에 저장해줍니다.
이메일의 경우 기존에 unique 속성이 있었는데, 이메일 속성을 소셜로그인의 경우 모두 공백으로 가입하게 설정하여 유니크 속성을 제거했습니다.
6) .yml 설정 : GitHub에서 확인해주세요!
상세 코드를 확인하고 싶은 분들은 Git-PR를 참조해주세요.
즐겁게 읽었습니다. 유용한 정보 감사합니다.