OAuth - 네이버 로그인 (provider 직접 등록)
스프링에서 기본적으로 구글, 페이스북 같은 로그인을 할 때 각각의 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도 회원가입이 잘 된 것을 확인할 수 있다.