오늘은 소셜 로그인 2번째로 네이버를 진행했습니다. 구글님?에께 아는 내용과 네이버 개발자 사이트를 참고해서 만들어 보았습니다.

먼저 해야 할일

네이버 역시 구글의 프로젝트 처럼 API애플리케이션을 만들어야 합니다. 저는 네이버로그인을 할 것임으로 애플리케이션 등록 사이트에 들어가서 이름을 정하고 아래의 선택은 네아로(네이버 아이디로 로그인)를 선택하면된다.

  • 네아로를선택하게 되면 자신의 사이트에 필요한 내용을 선택을 합니다.
  • 환경추가로는 을 추가합니다.
  • 하단의 서비스 URL에는 구글과 같이 자신의 사이트 URL을 위에 적어줍니다.
  • Callback은 역시 로그인이 성공하면 이동한 주소를 적어줍니다.
  • 이제 내애플리케이션에 들어가면 ClientID와 ClientSecret 이 생겼습니다.

pom.xml 추가하기

소셜 로그인 라이브러리 추가(네이버편)

네이버 로그인 구현은 깃허브에 올라와 있습니다.

  <!-- naver -->
  <dependency>
    <groupId>com.github.scribejava</groupId>
    <artifactId>scribejava-core</artifactId>
    <version>2.8.1</version>
  </dependency>

Scribe library용 Naver Login 구현체 만들기

  public class NaverLoginApi extends DefaultApi20 {

    protected NaverLoginApi() {
    }

    private static class InstanceHolder {
      private static final NaverLoginApi INSTANCE = new NaverLoginApi();
    }

    public static NaverLoginApi instance() {
      return InstanceHolder.INSTANCE;
    }

    @Override
    public String getAccessTokenEndpoint() {
      return "https://nid.naver.com/oauth2.0/token?grant_type=authorization_code";
    }

    @Override
    protected String getAuthorizationBaseUrl() {
      return "https://nid.naver.com/oauth2.0/authorize";
    }

  }

Scribe Library를 이용하여 네아로 인증 버튼을 위한 url생성

위에서 만든 구현체를 이용해서 네이버 로그인을 위한 url을 만들어 줍니다.

  public class NaverLoginBO {

    private final static String CLIENT_ID = "자신의 CLIENT_ID";
    private final static String CLIENT_SECRET = "자신의 CLIENT_SECRET";
    private final static String REDIRECT_URI = "자신이 작성한 로그인 성공시 url";

    public String generateState()
	{
	    SecureRandom random = new SecureRandom();
	    return new BigInteger(130, random).toString(32);
	}

    /* 네아로 인증  URL 생성  Method */
    public String getAuthorizationUrl(HttpSession session) {

    String state = generateState();
    session.setAttribute("state", state);

    /* Scribe에서 제공하는 인증 URL 생성 기능을 이용하여 네아로 인증 URL 생성 */
    OAuth20Service oauthService = new ServiceBuilder()
    		.apiKey(CLIENT_ID)
    		.apiSecret(CLIENT_SECRET)
    		.callback(REDIRECT_URI)
    		.state(state)
    		.build(NaverLoginApi.instance());

    return oauthService.getAuthorizationUrl();
    }
  }           

Controller Class에서 BO Class를 이용할 수 있도록 Bean등록(dispatcher-servlet.xml에 추가)

  <bean id="naverLoginBO" class="com.naver.naverlogintutorial.oauth.bo.NaverLoginBO" />

Controller 생성

저의 경우 구글 로그인과 섞여 있습니다.

  @RequestMapping(value = "login.do")
  public String initLogin(Model model, HttpSession session) throws Exception {

    /* 구글code 발행 */
    OAuth2Operations oauthOperations = googleConnectionFactory.getOAuthOperations();
    String googleAuthurl = oauthOperations.buildAuthorizeUrl(GrantType.AUTHORIZATION_CODE, googleOAuth2Parameters);
    String naverAuthUrl = naverLoginBO.getAuthorizationUrl(session);

    /* 생성한 인증 URL을 View로 전달 */
    model.addAttribute("naver_url", naverAuthUrl);
    model.addAttribute("google_url", googleAuthurl);

    /* 생성한 인증 URL을 Model에 담아서 전달 */
    return "page1/login.all";
  }

네이버 로그인 버튼 생성

저의 경우 간단한 이미지를 가져와서 연결만 했습니다.

  <a href="${naver_url}"><img height="30" src="http://static.nid.naver.com/oauth/small_g_in.PNG"/></a>

추가편

콜백페이지 생성(컨트롤러 추가)

까먹고 콜백페이지 연결을 안했습니다.

  // 네이버 Callback호출 메소드
  @RequestMapping(value = "naverLoginCallback.do")
  public String naverCallback() throws IOException {

    System.out.println("naver login success");

  return "main/main.tiles";
  }

저의 경우 성공을 하면 메인 페이지로 이동하도록 했습니다.

로그인은 이걸로 끝이 났습니다. 너무나도... 간단하게 끝이 납니다. 하지만 저는 헤매면서 했습니다. 내용이 좀 길어질거 같아 네이버 로그인 2편에서 개발자 페이지에서 선택한 프로필정보를 가져와서 뿌려보겠습니다.



Reference