ABOUT ME

쉬운거 하나없다

Today
Yesterday
Total
  • [Naver Login] 네이버 로그인 구현하기 (토큰 & 회원정보 담아오기 / 로그아웃)
    Spring Boot 2024. 1. 24. 14:42

    1. LoginController

    private NaverAPI naver;
    @GetMapping("/nlogin")
    	   public String nlogin(@RequestParam("code") String code, Model model, HttpSession session) {
    	      System.out.println(code);
    
    	      String access_token = naver.getAccessToken(code);
    
    	      try {
    	         User userInfo = naver.getUserInfo(access_token).orElse(null);
    	         System.out.println("*****************"+userInfo);
    
    	         if (userInfo != null) {
    	            session.setAttribute("loginUser", userInfo);
    	            return "redirect:/home";
    	         } else {
    	            return "redirect:/social/loginPage";
    	         }
    	         
    	      } catch (Exception e) {
    	         
    	         return "redirect:/social/loginPage";
    	      }
    
    	   }
    	   
    	   @GetMapping(value="/logout")
    	   public String logout(HttpSession session) {
    	      
    	      session.invalidate();
    	      return "redirect:/home";
    	   }

     

    네이버로그인과 로그아웃

    네이버로그인

    HttpSession session안에 NaverAPI Service로 불러온 naver 인스턴스 안에 로그인시 받아온 Token을 저장하고,

    저장된 Token이 null이면 session에 LoginInfo를 넣어준다. 그리고 home.jsp 로 이동.

    그렇지 않으면 그냥 loginPage.jsp 남아있는다.

     

    로그아웃 

    session.invalidate(); -> 로 session 초기화로 logininfo 없애서 logout을 진행시킨다.

     

    2. home.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
       <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<c:if test="${not empty sessionScope.loginUser}">
          ${sessionScope.loginUser.username}님 안녕하세요.
          <br/>
          <a href="social/logout">로그아웃</a>
          <a>게시판가기</a>
       </c:if>
       
       <c:if test="${empty sessionScope.loginUser}">
          <a href="social/loginPage">로그인</a>
       </c:if>
    </body>
    </html>

     

    3. NaverAPI

    package com.se.social.service;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URISyntaxException;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.Optional;
    
    import org.springframework.stereotype.Service;
    
    import com.se.social.domain.OauthId;
    import com.se.social.entity.User;
    import com.se.social.repository.UserRepository;
    
    import lombok.RequiredArgsConstructor;
    import lombok.extern.log4j.Log4j2;
    
    import com.google.gson.JsonElement;
    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    
    @Log4j2
    @Service
    @RequiredArgsConstructor
    public class NaverAPI {
    	
    	private final UserRepository repository;
    
       public String getAccessToken(String code) {
    
          try {
             String redirectURI = URLEncoder.encode("http://localhost:8080/social/nlogin", "UTF-8");
             String apiURL;
             apiURL = "https://nid.naver.com/oauth2.0/token?grant_type=authorization_code&";
             apiURL += "client_id=" + "***client_id***";
             apiURL += "&client_secret=" + "***client_secret***";
             apiURL += "&redirect_uri=" + "http://localhost:8080/social/nlogin";
             apiURL += "&code=" + code;
             apiURL += "&state=" + 1234; // 임의의 값
             String access_token = "";
             String refresh_token = "";
             System.out.println("apiURL=" + apiURL);
             
             
             URL url = new URL(apiURL);
             HttpURLConnection con = (HttpURLConnection) url.openConnection();
             con.setRequestMethod("POST");
             int responseCode = con.getResponseCode();
             BufferedReader br;
             System.out.print("responseCode=" + responseCode);
             
             
             if (responseCode == 200) { // 정상 호출
                 br = new BufferedReader(new InputStreamReader(con.getInputStream()));
             } else { // 에러 발생
                 br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
                 return null;
             }
    
             String inputLine;
             StringBuffer res = new StringBuffer();
             while ((inputLine = br.readLine()) != null) {
                res.append(inputLine);
             }
    
             if (responseCode == 200) {
                System.out.println(res.toString());
             }
             
             String result = res.toString(); // 변경: 읽은 내용을 String으로 변환
             System.out.println("response body : " + result);
    
             JsonParser parser = new JsonParser();
             JsonElement element = parser.parse(result);
    
             br.close();
    
             return element.getAsJsonObject().get("access_token").getAsString();
          } catch (Exception e) {
             System.out.println(e);
             
             return null;
          }
    
       }
       
    // getUserInfo
       public Optional<User> getUserInfo(String accessToken) throws IOException {
    
    	      // 네이버 로그인 접근 토큰;
    	      String apiURL = "https://openapi.naver.com/v1/nid/me";
    	      String headerStr = "Bearer " + accessToken; // Bearer 다음에 공백 추가
    	      String result = requestToServer(apiURL, headerStr);
    	      System.out.println("사용자 정보 " + result);
    	      
    	      
    	      JsonParser parser = new JsonParser();
    	      JsonElement element = parser.parse(result);
    	      
    	      JsonObject response = element.getAsJsonObject().get("response").getAsJsonObject();
    	      System.out.println("*****response: " + response);
    	      
    	      String token_id = response.getAsJsonObject().get("id").getAsString();
    	      String nickname = response.getAsJsonObject().get("name").getAsString();
    	      String email = response.getAsJsonObject().get("email").getAsString();
    	      System.out.println("email" +  email);
    
    	      Optional<User> opt_user = repository.findById(new OauthId("naver", token_id));
    	      System.out.println("--------opt_user : " + opt_user);
    	      
    	      User user = new User();
    	      if (opt_user.isPresent()) {
    	         return opt_user;
    	      }else {
    	         user.setUseremail(email);
    	         user.setUsername(nickname);
    	         user.setOauthtype("naver");
    	         user.setOauthtoken(token_id);
    	         repository.save(user);
    	         
    	         return Optional.of(user);
    	      }
    
    	   }
    
    
    	private String requestToServer(String apiURL, String headerStr) throws IOException {
    		URL url = new URL(apiURL);
    		HttpURLConnection con = (HttpURLConnection) url.openConnection();
    		con.setRequestMethod("GET");
    		System.out.println("header Str: " + headerStr);
    		if (headerStr != null && !headerStr.equals("")) {
    			con.setRequestProperty("Authorization", headerStr);
    		}
    		int responseCode = con.getResponseCode();
    		BufferedReader br;
    		System.out.println("responseCode=" + responseCode);
    		if (responseCode == 200) { // 정상 호출
    			br = new BufferedReader(new InputStreamReader(con.getInputStream()));
    		} else { // 에러 발생
    			br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
    		}
    		String inputLine;
    		StringBuffer res = new StringBuffer();
    		while ((inputLine = br.readLine()) != null) {
    			res.append(inputLine);
    		}
    		br.close();
    		if (responseCode == 200) {
    			return res.toString();
    		} else {
    			return null;
    		}
    	}
    }

     

     


    결과

     

Designed by Tistory.