[Java] 네이버 SNS로그인 (Oauth 2.0)
2021. 5. 11. 15:29

1. 애플리케이션 등록(오픈 API 신청)

developers.naver.com/apps/#/wizard/register

 

애플리케이션 - NAVER Developers

 

developers.naver.com

 

2. 로그인 요청하기

<a class="btn btn-success" href="https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id=nmliM_FmEvrfsR5ZPvjC&redirect_uri=http://localhost:8000/auth/naver/callback" >Naver</a>

- 받은 응답

 

3. 받은 코드로 엑세스토큰 요청하기(HTTP POST방식으로)

- 간단하게 HTTP POST 요청하기 withseungryu.tistory.com/116

 

[Spring] 간단하게 HTTP POST 요청하기

💡 POST 요청이란? 서버에 요청하는 방식 클라이언트가 서버에 요청을 할 때 제공해야하는 자원이 있을 때 Get방식은 요청하는 자원을 URL에 뒤에 보내는 반면 POST방식은 URL에 붙이지 않고 따로 데

withseungryu.tistory.com

RestTemplate rt = new RestTemplate();
		
		// HttpHeader 오브젝트 생성
		HttpHeaders headers = new HttpHeaders();
		headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");

		// HttpBody 오브젝트 생성
		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
		params.add("grant_type", "authorization_code");
		params.add("client_id", "nmliM_FmEvrfsR5ZPvjC");
		params.add("client_secret", "58rRVbgsh1");
		params.add("code", code);
		
		// HttpBody를 하나의 오브젝트에 담기
		HttpEntity<MultiValueMap<String, String>> naverTokenRequest = 
				new HttpEntity<>(params, headers); // naverTokenRequest <- 바디값을 가지고있는 엔티티가 된다.
		
		// Http 요청하기 - POST 방식으로 - 그리고 response 변수의 응답 받음.
		ResponseEntity<String> response = rt.exchange(
				"https://nid.naver.com/oauth2.0/token",
				HttpMethod.POST,
				naverTokenRequest,
				String.class
				); 

 

JSON 응답값을 확인하기위해 일시적으로 @ResponseBody로 Json값으로 응답받기

 

4. 응답반은 JSON값을 자바 오브젝트로 변경해준뒤 받기

// Gson, Json Simple, ObjectMapper // 응답받은 JSON값 Object로 변경해주는 템플릿
ObjectMapper objectMapper = new ObjectMapper();

OAuthToken oauthToken = null;

try {
oauthToken = objectMapper.readValue(response.getBody(), OAuthToken.class);
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (JsonProcessingException e) {
e.printStackTrace();
}

System.out.println("네이버 엑세스 토큰 : " + oauthToken.getAccess_token());


return "네이버 엑세스 토큰 : " + oauthToken.getAccess_token();

- 응답값

네이버 엑세스 토큰 : AAAAOliBkD9FWUXmVZdcZNiWc2uvV473Z38iSUtPmzUlyXU2j32u1j0XXx6e8V8O3e6x6MQRe5xuyv7aKK2VWzMzEEE

 

5. 엑세스토큰을 이용하여 프로필 API 호출하기

RestTemplate rt2 = new RestTemplate();

// HttpHeader 오브젝트 생성
HttpHeaders headers2 = new HttpHeaders();
headers2.add("Authorization", "Bearer " + oauthToken.getAccess_token());
headers2.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");

// HttpHeader 를 하나의 오브젝트에 담기
HttpEntity<MultiValueMap<String, String>> naverProfileRequest2 = 
new HttpEntity<>(headers2);

// Http 요청하기 - POST 방식으로 - 그리고 response 변수의 응답 받음.
ResponseEntity<String> response2 = rt2.exchange(
  "https://openapi.naver.com/v1/nid/me",
  HttpMethod.POST,
  naverProfileRequest2,
  String.class
); 

- 응답값

{
  resultcode: "00",
  message: "success",
  response: {
    id: "gvJs4EBVUpQ88IDhCUxn9SlUa7rUnNwOTrKIQpZJjTY",
    email: {private},
    mobile: {private},
    mobile_e164: {private},
    name: {private}
  }
}

 

6. 응답받은 JSON 값으로 네이버프로필 오브젝트 만들기

www.jsonschema2pojo.org/

 

jsonschema2pojo

Reference properties For each property present in the 'properties' definition, we add a property to a given Java class according to the JavaBeans spec. A private field is added to the parent class, along with accompanying accessor methods (getter and sette

www.jsonschema2pojo.org

jsonschema2pojo를 사용해서 json값 입력하여 편하게 네이버객체 만들기

package com.cos.blog.model;

public class NaverProfile {

	public String resultcode;
	public String message;
	public Response response;

	public class Response {

		public String id;
		public String email;
		public String mobile;
		public String mobile_e164;
		public String name;

	}
}
	ObjectMapper objectMapper2 = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

	NaverProfile naverProfile = null;

	try {
    		naverProfile = objectMapper2.readValue(response2.getBody(), NaverProfile.class);
        } catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		} 

 

오브젝트로 변환한뒤 네이버프로필로 회원가입을 진행하면 끝!

 


자세한 소스코드는 깃허브에 올려놨습니다.

github.com/mingstagram/miniblog

 

mingstagram/miniblog

miniblog git. Contribute to mingstagram/miniblog development by creating an account on GitHub.

github.com