-
OAuth - 네이버 로그인 (provider 직접 등록)스프링/스프링 시큐리티 2024. 1. 10. 20:56
스프링에서 기본적으로 구글, 페이스북 같은 로그인을 할 때 각각의 provider를 넘겨준다.
하지만 우리나라에서만 사용되는 네이버, 카카오등은 제공되지 않는다.
getAttribute
구글 - sub :1234
페이스북 - id : 1234
이런 것과 같이 네이버에도 attribute가 있을 것이다.
네이버는 기본적으로 provider가 아니기 때문에 직접 등록해줘야 한다. 구글, 페이스북과 같은 방식으로 개발자 사이트에서 애플리케이션 등록을 한 다음에 application.yml에 추가해준다.
application.yml
spring: security: oauth2: client: registration: naver: client-id: g1U5lR4UnvavwMI5XS1Y client-secret: DKnleHE7mY scope: - name - email client-name: Naver authorization-grant-type: authorization_code # code를 받아와서 인증 redirect-uri: http://localhost:8080/login/oauth2/code/naver 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 # 회원 정보를 json으로 받는데 response라는 키값으로 네이버가 리턴
네이버는 oauth-client가 들고있는 라이브러리의 providerId에 포함되어 있지 않기 때문에 provider를 직접 넣어줘야 한다.
(yml 파일은 띄어쓰기를 주의해야 한다.)
provider의 정보는 naver developers 공식문서에 있으니 저 값들을 활용해주면 된다.
NaverUserInfo.class
public class NaverUserInfo implements OAuth2UserInfo { private Map<String, Object> attributes; // getAttributes public NaverUserInfo(Map<String, Object> attributes) { this.attributes = attributes; } @Override public String getProviderId() { return (String) attributes.get("id"); } @Override public String getProvider() { return "naver"; } @Override public String getEmail() { return (String) attributes.get("email"); } @Override public String getName() { return (String) attributes.get("name"); } }
네이버도 역시 구글, 로그인 등과 같이 UserInfo를 만들어준다.
PrincipalOauth2UserService.class
@Service public class PrincipalOauth2UserService extends DefaultOAuth2UserService { ... (생략) 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 if (userRequest.getClientRegistration().getRegistrationId().equals("naver")) { oAuth2UserInfo = new NaverUserInfo((Map<String, Object>) oAuth2User.getAttributes().get("response")); } ... (생략) }
네이버일 경우도 추가를 해줘야 하는데, Map을 사용해서 getAttributes().get("response")를 파라미터로 넣어준다.
그 이유는 네이버의 getAttributes()의 값이 위와 같기 때문이다.
getAttributes()에서 바로 id, email, name을 key-value 형태로 갖는게 아니라 response 안에서 갖기 때문이다.
직접 등록한 provider인 naver도 회원가입이 잘 된 것을 확인할 수 있다.
'스프링 > 스프링 시큐리티' 카테고리의 다른 글
jwt를 위한 security 설정 (0) 2024.01.12 JWT(Json Web Token) (0) 2024.01.12 OAuth - 페이스북 로그인 (OAuth2UserInfo - 각각의 provider) (0) 2024.01.10 OAuth - 구글 로그인(구글 로그인 및 자동 회원가입) (0) 2024.01.10 OAuth - 구글 로그인(Authentication 객체가 가지는 2가지 타입) (0) 2024.01.09