반응형
이번에는 네이버 아이디로 로그인(네아로) 를 구현해보도록 하겠습니다.
참고 :
- 구글 계정으로 로그인은 여기를 참조하시기 바랍니다.
- 카카오 계정으로 로그인은 여기를 참조하시기 바랍니다.
- 소셜 로그인을 하기위해 필요한 API 키 발급은 여기를 참조하시기 바랍니다.
1. 네아로 연동 URL 요청
아래처럼 원하는 태그의 요청 URL을 완성 시켜서 넣어주도록 합니다. (state는 원래 계속 랜덤으로 생성해주어야 하는데, 여기서는 테스트를 위해 "state"라는 값으로 하겠습니다.)
<a href="https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id=CLIENT_ID&state=state&redirect_uri=CALLBACK_URL">네이버로 로그인 하기</a>
2. Redirect URI 처리하는 컨트롤러 생성
저는 애플리케이션에서 Redirect URI를 "/login/oauth/code/naver"로 설정했습니다.
@Controller
@RequestMapping("/login/oauth/code")
public class OAuthTestController {
... 생략 ...
@GetMapping("/naver")
@ResponseBody
public String naverOAuthRedirect(@RequestParam String code, @RequestParam String state) {
// state는 무시하겠습니다.
return "code : " + code;
}
이렇게 되면 내가 설정해놓은 URI로 응답이 오게 되고, 이 컨트롤러에서 처리하게 됩니다. 그럼 정상적으로 아래처럼 코드가 찍히게 됩니다.
Response:
code : {code}
3. 인증 토큰으로 Access Token으로 교환하기
요청은 아래와 같이 MultiValueMap에 key:value 형식으로 값을 넣어줘서 요청 하시면 되겠습니다.
Request :
@GetMapping("/naver")
@ResponseBody
public String naverOAuthRedirect(@RequestParam String code, @RequestParam String state) {
// RestTemplate 인스턴스 생성
RestTemplate rt = new RestTemplate();
HttpHeaders accessTokenHeaders = new HttpHeaders();
accessTokenHeaders.add("Content-type", "application/x-www-form-urlencoded");
MultiValueMap<String, String> accessTokenParams = new LinkedMultiValueMap<>();
accessTokenParams.add("grant_type", "authorization_code");
accessTokenParams.add("client_id", "{client_id");
accessTokenParams.add("client_secret", "{client_secret}");
accessTokenParams.add("code" , code); // 응답으로 받은 코드
accessTokenParams.add("state" , state); // 응답으로 받은 상태
HttpEntity<MultiValueMap<String, String>> accessTokenRequest = new HttpEntity<>(accessTokenParams, accessTokenHeaders);
ResponseEntity<String> accessTokenResponse = rt.exchange(
"https://nid.naver.com/oauth2.0/token",
HttpMethod.POST,
accessTokenRequest,
String.class
);
return "accessToken: " + accessTokenResponse.getBody();
}
}
Response :
access token 발급 완료!! 😆
4. Access Token을 이용해 프로필 API 호출하기
헤더에만 Authorization 값만 넣어주면 되는 것 같습니다.
아래와 같이 요청을 하시면 되겠습니다.
Request :
@GetMapping("/naver")
public String naverOAuthRedirect(@RequestParam String code, @RequestParam String state, Model model) {
... 생략 ....
// 이전에 받았던 Access Token 응답
ObjectMapper objectMapper = new ObjectMapper();
// json -> 객체로 매핑하기 위해 NaverOauthParams 클래스 생성
NaverOauthParams naverOauthParams = null;
try {
naverOauthParams = objectMapper.readValue(accessTokenResponse.getBody(), NaverOauthParams.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// header를 생성해서 access token을 넣어줍니다.
HttpHeaders profileRequestHeader = new HttpHeaders();
profileRequestHeader.add("Authorization", "Bearer " + naverOauthParams.getAccess_token());
HttpEntity<HttpHeaders> profileHttpEntity = new HttpEntity<>(profileRequestHeader);
// profile api로 생성해둔 헤더를 담아서 요청을 보냅니다.
ResponseEntity<String> profileResponse = rt.exchange(
"https://openapi.naver.com/v1/nid/me",
HttpMethod.POST,
profileHttpEntity,
String.class
);
return "profile response : " + profileResponse.getBody();
}
Response :
요청한 정보에 따라서 아래와 같이 값이 응답 데이터로 받을 수 있겠습니다.
이상 네이버 로그인에 대해서 알아보았습니다.
감사합니다!
REFERENCES
네이버아이디로그인 개발가이드 - LOGIN
네이버아이디로그인 개발가이드 1. 개요 4,200만 네이버 회원을 여러분의 사용자로! 네이버 회원이라면, 여러분의 사이트를 간편하게 이용할 수 있습니다. 전 국민 모두가 가지고 있는 네이버 아
developers.naver.com
반응형