개발/Java&Kotlin

[Spring] 스프링시큐리티 OAuth2.0 적용해보기(Naver)

devhooney 2022. 9. 2. 09:17
728x90

이번엔 네이버 로그인을 작업해보려 한다.

지난 포스팅을 참고하고, 이어서 작업하려 한다.

https://devhooney.tistory.com/101

 

[Spring] 스프링시큐리티 OAuth2.0 적용해보기(Facebook)

이번엔 페이스북 로그인을 작업해보려한다. 지난 포스팅에 사용했던 코드에 이어서 작업하려한다. https://devhooney.tistory.com/100 [Spring] 스프링시큐리티 OAuth2.0 적용해보기(Google) 구글, 페이스북, 네

devhooney.tistory.com

 

1. 네이버 개발자 센터

- 상단 메뉴의 Application에서  애플리케이션 등록 클릭하여 이름을 작성하고 사용 API selectbox에서 네이버 로그인 선택

- checkbox가 나오면 회원이름, 이메일 주소 필수에 체크 

- 로그인 오픈 API서비스 환경 selectbox에 PC웹 선택 후 등록하기 클릭

- 내 애플리케이션 목록에 새로 만든 앱을 클릭하면 Client ID, Client Secret 정보가 있다.

 

 

2. application.yml 수정

security:
  oauth2:
    client:
      registration:
        google:
          client-id: 구글
          client-secret: 구글
          scope: email, profile

        facebook:
          client-id: 페이스북
          client-secret: 페이스북
          scope: email, public_profile

        naver:
          client-id: 네이버
          client-secret: 네이버
          scope: name, email
          client-name: Naver
          authorization-grant-type: authorization_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 라이브러리에서 기본 제공해주지 않기 때문에 Provider 설정을 추가로 해줘야 한다.

- 공식문서를 참고 했으니 클라이언트 아이디와 시크릿만 제외하고 그대로 사용해도 된다.(scope를 제외한 나머지는 그대로 사용해야함)

 

3. PrincipalOauth2UserService 수정

- 페이스북 때와 마찬가지로 네이버 관련 설정만 추가하면 된다.

OAuth2User oAuth2User = super.loadUser(userRequest);
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) oAuth2User.getAttributes().get("response"));
} else {
    System.out.println("Only Google and Facebook and naver.");
}

- 네이버는 getAttibutes()를 System.out.println()으로 확인해보면 원하는 값들이 "response"라는 객체 안에 있으므로 get을 이용해서 꺼내 사용해야 한다.

 

4. provider 패키지 안에 NaverUserInfo 클래스 추가

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");
    }
}

 

5. loginForm.html 수정

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>로그인 페이지</title>
</head>
<body>
<h1>로그인 페이지</h1>
<hr>
<form action="/login" method="POST">
    <input type="text" name="username" placeholder="Username"><br>
    <input type="password" name="password" placeholder="Password"><br>
    <button>로그인</button>
</form>
<a href="/oauth2/authorization/google">구글 로그인</a>
<a href="/oauth2/authorization/facebook">페이스북 로그인</a>
<a href="/oauth2/authorization/naver">네이버 로그인</a>
<a href="/joinForm">회원가입을 아직 하지 않으셨나요?</a>
</body>
</html>

 

6. 확인

728x90