Spring - 네이버 아이디로 로그인, 회원가입 만들기- 2

2021. 4. 28. 15:07Java/Spring

반응형

지난장에 이어서 이번에는 소스코드에 적용을 하겠습니다.

 

작업 환경은 Spring boot,JSP,maven 입니다.

 

 

1. pom.xml 에 dependency 추가

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

2. NaverLoginApi.java 추가

import org.springframework.stereotype.Component;

import com.github.scribejava.core.builder.api.DefaultApi20;

@Component
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";
	}
}

3.NaverLoginBO.java 추가

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.UUID;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.util.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;

@Component
public class NaverLoginBO {
	
	/* 인증 요청문을 구성하는 파라미터 */
	//client_id: 애플리케이션 등록 후 발급받은 클라이언트 아이디
	//response_type: 인증 과정에 대한 구분값. code로 값이 고정돼 있습니다.
	//redirect_uri: 네이버 로그인 인증의 결과를 전달받을 콜백 URL(URL 인코딩). 애플리케이션을 등록할 때 Callback URL에 설정한 정보입니다.
	//state: 애플리케이션이 생성한 상태 토큰
	private static String CLIENT_ID ;
	private static String CLIENT_SECRET;
	
	@Value("${NAVER.SECRET}")
	public void setSecret(String value) {
		CLIENT_SECRET = value;
	}
	@Value("${NAVER.CLIENT}")
	public void setClient(String value) {
		CLIENT_ID = value;
	}

	
	private final static String REDIRECT_URI = "http://localhost:8110/user/userNaverLoginPro.do";
	private final static String SESSION_STATE = "oauth_state";
	/* 프로필 조회 API URL */
	private final static String PROFILE_API_URL = "https://openapi.naver.com/v1/nid/me";

	/* 네이버 아이디로 인증  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.pathEquals(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);
	}
	/* 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();
	}


}

1,2,3 을 통해서 네이버 api 사용 인증을 가져오고 네이버 회원 프로필 정보를 얻어온다.

 

3번 클래스에서  REDIRECT_URI 변수의 값은 본인이 개발자 센터에 등록한 callBack Url을 적어준다.

 

	private static String CLIENT_ID ;
	private static String CLIENT_SECRET;
	
	@Value("${NAVER.SECRET}")
	public void setSecret(String value) {
		CLIENT_SECRET = value;
	}
	@Value("${NAVER.CLIENT}")
	public void setClient(String value) {
		CLIENT_ID = value;
	}

 

해당 코드는 네이버 API key를 입력하는 부분인데 보안을 지키기 위해 properties 파일로 빼줬다.

 

git 등에 올릴시 해당 파일을 빼고 해당 파일은 개인적으로 전달하여 협업해야한다.

위와 같이 파일로 빼주고 해당 내용을 불러와서 적용하는 방식이다.

 

해당 파일 내용을 부르기 위해서는 아래와 같이 부트 시작 설정 파일에 등록을 해야한다.

위와 같이 등록을 해준다면 아래와 같이 값을 받아온다.

 

 

 

이제 본격적으로 메소드를 작성 할 준비는 끝났다. 다음장에서 계속!

반응형