FIF's 코딩팩토리

[Spring]MVC패턴 네이버아이디로 로그인(네아로) 본문

Back-End/Spring(스프링)

[Spring]MVC패턴 네이버아이디로 로그인(네아로)

FIF 2019. 5. 27. 16:57
반응형

 

네이버아이디로로그인 서비스를 이용하려면 오픈 API를 신청해야 한다.

 

https://developers.naver.com/products/login/api/

 

네이버 아이디로 로그인 소개

네이버 아이디로 로그인 별도의 아이디, 비밀번호없이 네이버 아이디로 간편하게 외부 서비스에 로그인 할 수 있도록 하는 서비스입니다. 이용자는 복잡하고 번거로운 회원 가입 절차 없이 편하게 서비스를 이용하고, 사업자는 회원 가입, 로그인에 대한 허들을 낮춰 회원수...

developers.naver.com

 

 

 

오픈 API이용 신청을 누른다.

 

 

 

 

 

자기가 만들 서비스목적에 맞게 API설정을 한다.

 

 

 

Client ID와 Clinet Secret이 나온다.

복사해서 잘보이는 곳에 붙여넣기 해놓자.

 

 

pom.xml 에 naver dependency추가

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

 

 

 

dispatcher-servlet에 NaverController추가

<!-- NaverLoginController Class에 대한 Bean설정 추가 -->
	<bean class="controller.NaverController" />

 

 

 

NaverController.java

package controller;

import java.io.IOException;
import java.util.UUID;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringUtils;
import com.github.scribejava.core.builder.ServiceBuilder;
import com.github.scribejava.core.model.OAuth2AccessToken;
import com.github.scribejava.core.model.OAuthRequest;
import com.github.scribejava.core.model.Response;
import com.github.scribejava.core.model.Verb;
import com.github.scribejava.core.oauth.OAuth20Service;

import api.NaverLoginApi;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;



public class NaverController {

   private final static String CLIENT_ID = "봍사해놓은 클라이언트 아이디 붙여넣기 하세요";
   private final static String CLIENT_SECRET = "클라이언트시크릿 붙여넣기 하세요!";
   private final static String REDIRECT_URI = "http://localhost:8090/myfinal/naverlogin.do";
   private final static String SESSION_STATE = "oauth_state";
   
   /* 네아로 인증 URL 생성 Method */
   public String getAuthorizationUrl(HttpSession session) {

      /* 세션 유효성 검증을 위하여 난수를 생성 */
      String state = generateRandomString();
      /* 생성한 난수 값을 session에 저장 */
      setSession(session, state);

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

      return oauthService.getAuthorizationUrl();
   }

   /* 네아로 Callback 처리 및 AccessToken 획득 Method */
   public OAuth2AccessToken getAccessToken(HttpSession session, String code, String state) throws IOException {

      /* Callback으로 전달받은 세선검증용 난수값과 세션에 저장되어있는 값이 일치하는지 확인 */
      String sessionState = getSession(session);
      if (StringUtils.equals(sessionState, state)) {

         OAuth20Service oauthService = new ServiceBuilder().apiKey(CLIENT_ID).apiSecret(CLIENT_SECRET)
               .callback(REDIRECT_URI).state(state).build(NaverLoginApi.instance());

         /* Scribe에서 제공하는 AccessToken 획득 기능으로 네아로 Access Token을 획득 */
         OAuth2AccessToken accessToken = oauthService.getAccessToken(code);
         return accessToken;
      }
      return null;
   }

   /* 세션 유효성 검증을 위한 난수 생성기 */
   private String generateRandomString() {
      return UUID.randomUUID().toString();
   }

   /* http session에 데이터 저장 */
   private void setSession(HttpSession session, String state) {
      session.setAttribute(SESSION_STATE, state);
   }

   /* http session에서 데이터 가져오기 */
   private String getSession(HttpSession session) {
      return (String) session.getAttribute(SESSION_STATE);
   }

   /* 프로필 조회 API URL */
   private final static String PROFILE_API_URL = "https://openapi.naver.com/v1/nid/me";

   /* Access Token을 이용하여 네이버 사용자 프로필 API를 호출 */
   public String getUserProfile(OAuth2AccessToken oauthToken) throws IOException {

      OAuth20Service oauthService = new ServiceBuilder().apiKey(CLIENT_ID).apiSecret(CLIENT_SECRET)
            .callback(REDIRECT_URI).build(NaverLoginApi.instance());

      OAuthRequest request = new OAuthRequest(Verb.GET, PROFILE_API_URL, oauthService);
      oauthService.signRequest(oauthToken, request);
      Response response = request.send();
      return response.getBody();
   }
   
   public void naverProfile() {
        String token = "YOUR_ACCESS_TOKEN";// 네이버 로그인 접근 토큰;
           String header = "Bearer " + token; // Bearer 다음에 공백 추가
           try {
               String apiURL = "https://openapi.naver.com/v1/nid/me";
               URL url = new URL(apiURL);
               HttpURLConnection con = (HttpURLConnection)url.openConnection();
               con.setRequestMethod("GET");
               con.setRequestProperty("Authorization", header);
               int responseCode = con.getResponseCode();
               BufferedReader br;
               if(responseCode==200) { // 정상 호출
                   br = new BufferedReader(new InputStreamReader(con.getInputStream()));
               } else {  // 에러 발생
                   br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
               }
               String inputLine;
               StringBuffer response = new StringBuffer();
               while ((inputLine = br.readLine()) != null) {
                   response.append(inputLine);
               }
               br.close();
               System.out.println(response.toString());
           } catch (Exception e) {
               System.out.println(e);
           }
       }
   

}

 

 

 

MainController.java

naverLogin 메소드

// 네이버 로그인 & 회원정보(이름) 가져오기
	@RequestMapping(value = "/naverlogin.do", produces = "application/json;charset=utf-8", method = { RequestMethod.GET,
			RequestMethod.POST })
	public ModelAndView naverLogin(@RequestParam String code, @RequestParam String state, HttpSession session)
			throws IOException {
		ModelAndView mav = new ModelAndView();
		OAuth2AccessToken oauthToken;
		oauthToken = naverLoginDTO.getAccessToken(session, code, state);

		// 로그인한 사용자의 모든 정보가 JSON타입으로 저장되어 있음
		apiResult = naverLoginDTO.getUserProfile(oauthToken);

		// 내가 원하는 정보 (이름)만 JSON타입에서 String타입으로 바꿔 가져오기 위한 작업
		JSONParser parser = new JSONParser();
		Object obj = null;
		try {
			obj = parser.parse(apiResult);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		JSONObject jsonobj = (JSONObject) obj;
		JSONObject response = (JSONObject) jsonobj.get("response");
		String nname = (String) response.get("name");
		String nemail = (String) response.get("email");
		String ngender = (String) response.get("gender");
		String nbirthday = (String) response.get("birthday");
		String nage = (String) response.get("age");
		String nimage = (String) response.get("profile_image");

		// 로그인&아웃 하기위한 세션값 주기
		session.setAttribute("nname", nname);
		session.setAttribute("nemail", nemail);
		session.setAttribute("ngender", ngender);
		session.setAttribute("nbirthday", nbirthday);
		session.setAttribute("nage", nage);
		session.setAttribute("nimage", nimage);

		// 네이버 로그인 성공 페이지 View 호출
		mav.setViewName("main");
		return mav;
	}// end naverLogin()

 

 

 

네이버로그인 jsp부분

 <div id="naver_id_login" style="text-align: center">
         <a href="${naver_url}"><img width="223" 
         src="${pageContext.request.contextPath}/images/naver_Bn_Green.PNG" /></a>
 </div>

 

 

 

jsp부분의 이미지

 

 

 

MainContoller서 naver_url을 통해 jsp로 접근한다.

// 로그인 화면
	@RequestMapping(value = "/memberloginform.do", method = RequestMethod.GET)
	public ModelAndView memberLoginForm(HttpSession session) {
		ModelAndView mav = new ModelAndView();
		/* 네아로 인증 URL을 생성하기 위하여 getAuthorizationUrl을 호출 */
		String naverAuthUrl = naverLoginDTO.getAuthorizationUrl(session);
		String kakaoUrl = KakaoController.getAuthorizationUrl(session);

		/* 생성한 인증 URL을 View로 전달 */
		mav.setViewName("memberloginform");
		// 네이버 로그인
		mav.addObject("naver_url", naverAuthUrl);
		// 카카오 로그인
		mav.addObject("kakao_url", kakaoUrl);

		return mav;
	}// end memberLoginForm()

 

 

 

반응형

'Back-End > Spring(스프링)' 카테고리의 다른 글

[Spring]MVC 프로젝트 실행시 404 에러  (1) 2019.08.22
[Spring] UTF-8 한글 깨짐  (0) 2019.08.22
[Spring]MVC패턴 회원가입  (13) 2019.05.14
Comments