일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- java
- java기초
- 자바연습문제
- 직장인인강
- 패스트캠퍼스후기
- 웹
- 데이터베이스
- 한번에끝내는JavaSpring웹개발마스터초격차패키지Online강의
- 한번에끝내는JavaSpring웹개발마스터초격차패키지Online
- 디자인
- ncs
- 자바기초
- linux
- 디자인패턴
- 자바예제
- 스프링
- js
- DB
- DesignPattern
- 재택근무
- 직장인자기계발
- 자바
- Spring
- 자바기본
- javabasic
- 국비
- 패스트캠퍼스
- String
- 패캠챌린지
- 리눅스
Archives
- Today
- Total
FIF's 코딩팩토리
[Spring]MVC패턴 네이버아이디로 로그인(네아로) 본문
반응형
네이버아이디로로그인 서비스를 이용하려면 오픈 API를 신청해야 한다.
https://developers.naver.com/products/login/api/
오픈 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