-
[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; } } }
결과
'Spring Boot' 카테고리의 다른 글
[무한댓글 게시판] 2. Entity / Repository / Service + QueryDSL 사용 (0) 2024.02.15 [무한댓글 게시판] 1. 테이블 설계(+테이블 생성) (0) 2024.02.09 [Google Login] 구글 로그인 구현하기 (토큰 & 회원정보) (1) 2024.01.26 [Kakao Login] 카카오 로그인 구현하기 (토큰 / 정보 받아오기 / 회원가입 - 로그인) (0) 2024.01.18 [Kakao Login] 카카오 로그인 구현하기 (초기세팅 / 값 받아오기) (0) 2024.01.18