ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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도 회원가입이 잘 된 것을 확인할 수 있다.

Designed by Tistory.