
구글과 다르게 추가적인 설정을 수동으로 작성해 줘야 함
security:
oauth2:
client:
provider:
naver:
authorization-uri: https://nid.naver.com/oauth2.0/authorize
token-uri: https://nid.naver.com/oauth2.0/token
user-info-uri: https://openapi.naver.com/v1/nid/me
user-name-attribute: response
registration:
naver:
client-name: naver
client-id: lItVtDzpM9_KHqoyG2ps
client-secret: {password}
redirect-uri: “{baseUrl}/{action}/oauth2/code/{registration}”
authorization-grant-type: authorization_code
client-authentication-method: client_secret_post
scope:
- name
- nickname
redirect-uri 형식 → “{baseUrl}/{action}/oauth2/code/{registration}”authorization-grant-type : 권한 부여 방식 지정client-authentication-method :❗️여기까지 설정하고 실행하면 로그인 했을때 정보가 저장되지 않는 오류 발생
→ User Attribute 형식이 달라서
naver는 attribute에 response안에 Map 형식으로 들어가있기 때문
→ Factory Pattern으로 객체를 생성해주는 클래스를 따로 만들어서 사용
public static MemberDetails memberDetails(String provider,OAuth2User oauth2User) {
Map<String, Object> attributes = oauth2User.getAttributes();
switch ( provider.toUpperCase()){
case "GOOGLE" -> {
return MemberDetails.builder()
.name(attributes.get("name").toString())
.email(attributes.get("email").toString())
.attributes(attributes)
.build();
}
case "NAVER" -> {
Map<String, Object> properties = (Map<String, Object>) attributes.get("response");
return MemberDetails.builder()
.name(properties.get("name").toString())
.email(properties.get("id") + "@naver.com")
.attributes(attributes)
.build();
}
default -> throw new IllegalArgumentException("지원하지 않는 제공자: " + provider);
}
}
OAuth2User 를 매개변수로 받는다. → 공급자는 알 수 없기 때문에 provider 도 따로 매개변수로 받아준다.
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
OAuth2User oAuth2User = super.loadUser(userRequest);
String provider = userRequest.getClientRegistration().getRegistrationId().toUpperCase();
MemberDetails memberDetails = MemberDetailsFactory.memberDetails(provider, oAuth2User);
Optional<Member> memberOptional = memberRepository.findByEmail(memberDetails.getEmail());
//있으면 있는걸 반환해주고 없으면 안에 있는 것을 반환
Member findMember = memberOptional.orElseGet(
() -> {
Member saved = Member.builder()
.email(memberDetails.getEmail())
.name(memberDetails.getName())
.provider(provider)
.build();
return memberRepository.save(saved);
}
);
//중복 가입 방지
if(findMember.getProvider().equals(provider)) {
return memberDetails.setRole(findMember.getRole());
} else {
throw new RuntimeException();
}
OAuth2User 를 받아옴provider 를 받아옴
@Accessors(chain = true)→ Setter가 체이닝이 된다. → 반환 가능
Kakao OAuth2 실습도 Naver와 동일
httpBasic() → http와 관련된 요청 설정 → disablecors() csrf() 도 disableformLogin도 더 이상 HTML로 받지 않기 때문에 disable.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
sessionManagement → 세션에 대한 설정sessionCreationPolicy → 세션을 어떻게 다룰지 정책을 결정→ 더 이상 세션의 상태를 기억하지 않겠다는 설정
적은게 굉장히 적네...ㅎㅎ 아무래도 조퇴해서ㅜ
오늘은 실습 따라가기가 정말 힘들었지만 그래도 재밌다 재밌어!