𝝅번째 알파카의 개발 낙서장

screen

[OAuth2.0] ScribeJAVA로 OAuth2.0 인증서버 구축하기 - 4. NAVER OAuth 서비스 신청 및 모듈 구현하기

posts

JAVA

시리즈 톺아보기

OAuth2.0 인증서버 구축기

OAuth2.0 인증서버 구축기
count

개요 🔗

첫 번째 플랫폼으로, NAVER에 OAuth 서비스를 신청하고 인증 모듈을 구현한다.

NAVER OAuth 서비스 신청하기 🔗

API 정보를 얻기 위해 NAVER OAuth 서비스를 신청하자.

1. 네이버 개발자 센터 접속하기 🔗

로그인 후 네이버 개발자 센터에 접속하자.

NAVER의 OAuth는 네이버 아이디로 로그인. 속칭 네아로라는 명칭으로 서비스를 제공하고 있다.

네이버 개발자 센터에서 해당 서비스를 사용하는 애플리케이션을 등록하면 된다.


상단 헤더의 [Application - 애플리케이션 등록] 메뉴로 접속하자.

2. 애플리케이션 등록 🔗

OAuth 정보를 관리하게 될 애플리케이션을 등록하자.

아래의 항목을 모두 입력해야하며, 해당 항목들은 심사 후에도 언제든지 변경이 가능하다.

애플리케이션 이름 🔗

해당 애플리케이션의 이름이다. 이 이름은 네이버 로그인 창에도 표시가 된다.

image

필자의 네아로 창 예시. 필자의 애플리케이션 이름은 OAuth2로, 위 창의 OAuth2 부분에 지정한 이름이 표시된다.

사용 API 🔗

사용할 API를 선택한다.

네이버와 관련된 여러 API를 제공하지만, 지금은 프로젝트의 목적에 맞게 네아로 서비스를 선택한다.


네아로 서비스를 선택하면 제공 정보를 선택하는 폼이 추가된다.

이는 사용자의 인증 정보로 얻을 수 있는 정보를 선별하는 것으로, 필수와 추가로 구분하여 선택할 수 있다.

필수 혹은 추가로 지정된 정보는 추후 사용자의 정보 호출 시 접근이 가능하다.


🛑 주의!!
네이버는 필수 정보조차도 사용자가 임의로 거부할 수 있다. 즉, 서비스 운영에 있어서 이 정보가 필수라는 사항은 사용자에게 고지하더라도, 사용자가 이를 거부해버리면 서비스 입장에선 방법이 없다.
상기한 이유로, 네이버는 사용자 정보 검증의 중요도가 타 플랫폼보다 높다. 필수와 추가의 차이점은 체크박스의 기본값이 체크냐 해제냐로 갈린다. 필수의 경우 기본적으로 체크하나, 추가의 경우 기본적으로 해제된 채 사용자에게 제공된다.

원하는 정보를 선택하자. 반드시 필요하다면 필수를, 그렇지 않다면 추가로 두자. 혹시 모른답시고 전체 데이터를 체크하지 말자. 물론 불가능한 건 아니지만, 추후 OAuth 키 배포 활성화 심사에서 불필요하거나 과도한 데이터 접근 허가를 요구할 경우 심사를 반려할 수도 있다. 반드시 필요한 최소한의 정보만을 요구하자.

로그인 오픈 API 서비스 환경 🔗

OAuth를 사용할 환경에 대해 입력한다.

해당 프로젝트는 웹을 대상으로 구축되었으므로, PC 웹으로 선택한다. Android나 iOS를 추가할 수도 있다. 여러 환경을 동시에 추가하여 하나의 키로 여러 플랫폼에 접근하는 식의 통합 관리도 가능하다.


서비스 URL은 네아로를 적용하려는 서비스의 URL이다.

Callback URL은 로그인 후 결과를 전달할 URL이다. 최대 5개까지 지정할 수 있으며, 추후 설정할 naver.properties 파일의 callback은 이 Callback URL 중 하나가 입력되어야 한다. 플랫폼 로그인 과정에서 등록되지 않은 Callback URL이 감지될 경우 오류를 출력한다.

https://example.com/oauth2 같은 URL의 영식을 입력하며, https://example.com/oauth2?key=value와 같이 임의의 URL 파라미터를 붙여도 된다.

모든 항목에 이상이 없으면 애플리케이션을 만들자.

API 정보 확인 🔗

image

애플리케이션을 만들면 API와 Secret을 확인할 수 있다. Secret은 기본적으로 마스킹되어있으며, 별도의 버튼을 눌러 확인할 수 있다. Secret이 유출되었다고 판단될 경우, 재발급을 할 수도 있다. 이 경우 당연히도 인증 서버에 변경된 Secret을 적용해야한다.

NAVER 인증 모듈 구현하기 🔗

필요한 모든 준비가 갖춰졌으니, NAVER 인증 모듈을 구현해보자. 이전에 구현한 AuthModule을 상속받아 구현할 것이다.

JAVA

0public class NaverAuthModule extends AuthModule
1{
2 // NAVER 인증 모듈
3}

객체의 기본 형식은 위와 같다.

메서드 메서드 타입 내용 구현 필요 여부
getAuthorizationUrl 추상 인증 URL 반환 메서드 Y
getAccessToken 접근 토큰 반환 메서드
getRefreshAccessToken 접근 토큰 갱신 및 반환 메서드
getUserInfo 사용자 정보 응답 반환 메서드
getRefreshTokenEndpoint 접근 토큰 재발급 요청 URL 반환 메서드
getApiKeyBean API 키 객체 반환 메서드
getUserInfoEndPoint 사용자 정보 요청 URL 반환 메서드
getUserInfoBean 추상 유저 정보 객체 반환 메서드 Y
deleteInfo 추상 연동 해제 결과 반환 메서드 Y
getUpdateAuthorizationUrl 추상 정보 제공 동의 갱신 URL 반환 메서드 Y
getAccessTokenEndpoint 추상 접근 토큰 요청 URL 반환 메서드 Y
getAuthorizationBaseUrl 추상 인증 API 요청 URL 반환 메서드 Y

NAVER 모듈이 구현해야하는 대상은 위와 같다.

properties 파일 생성하기 🔗

WEB-INF 아래 naver.properties 파일을 생성한다. 기 생성된 sample.properties를 복사해서 사용해도 된다.

PROPERTIES

0api=API_KEY
1secret=SECRET_KEY
2callback=CALLBACK_URL

기본적인 형식은 위와 같으며, 각 항목에 해당하는 값을 입력하면 된다.

인증 모듈 기본 메서드 및 변수 할당하기 🔗

인증 모듈이 정상적으로 동작하기 위해선 기본적으로 지정해줘야할 메서드와 변수들이 존재한다. API 정보 설정, 인스턴스 반환같은 것들이다.

JAVA

0private static final String MODULE_NAME = "naver";
1
2private static final String API_KEY;
3private static final String SECRET_KEY;
4private static final String CALLBACK_URL;
5
6static
7{
8 ApiKeyBean apiKeyBean = getApiKeyBean(MODULE_NAME);
9
10 API_KEY = apiKeyBean.getApi();
11 SECRET_KEY = apiKeyBean.getSecret();
12 CALLBACK_URL = apiKeyBean.getCallback();
13}
14
15private static final ServiceBuilderOAuth20 SERVICE_BUILDER = new ServiceBuilder(API_KEY).apiSecret(SECRET_KEY).callback(CALLBACK_URL);
16
17private static final NaverAuthModule INSTANCE = new NaverAuthModule(SERVICE_BUILDER);
18
19private NaverAuthModule(ServiceBuilderOAuth20 serviceBuilder)
20{
21 super(serviceBuilder);
22}
23
24public static NaverAuthModule getInstance()
25{
26 return INSTANCE;
27}
구분 형식 내용
MODULE_NAME String 모듈 이름
API_KEY String API키
SECRET_KEY String Secret키
CALLBACK_URL String 콜백 URL
SERVICE_BUILDER ServiceBuilderOAuth20 OAuth2.0 서비스 빌더
INSTANCE NaverAuthModule 인스턴스

정의된 변수는 전부 static final로 선언되어 있어서, 인스턴스 생성 시 한 번만 선언되며 재할당이 불가능하도록 관리한다.

static{ } 구문을 통해 인스턴스 생성 시 API 정보를 할당하도록 구성했다.

API 할당 시 getApiKeyBean() 메서드를 통해 제공된 이름을 갖는 properties를 분석하여 ApiKeyBean 객체를 반환받아 사용한다.

API URL 할당하기 🔗

각 API 별 요청 URL을 반환하는 메서드를 구현하자.

JAVA

0@Override
1public String getAccessTokenEndpoint()
2{
3 return "https://nid.naver.com/oauth2.0/token";
4}
5
6@Override
7protected String getAuthorizationBaseUrl()
8{
9 return "https://nid.naver.com/oauth2.0/authorize";
10}
11
12@Override
13protected String getUserInfoEndPoint()
14{
15 return "https://openapi.naver.com/v1/nid/me";
16}
  • getAccessTokenEndpoint() - 토큰과 관련된 API는 해당 메소드가 반환하는 URL을 토대로 사용한다.
  • getAuthorizationBaseUrl() - 인증과 관련된 API는 해당 메소드가 반환하는 URL을 토대로 사용한다.
  • getUserInfoEndPoint() - 사용자 정보와 관련된 API는 해당 메소드가 반환하는 URL을 토대로 사용한다.

OAuth2.0 서비스를 수행함에 있어서 필요한 URL은 위와 같다. 이 중 getAccessTokenEndpoint()getAuthorizationBaseUrl()는 scribeJAVA 라이브러리의 객체인 DefaultApi20의 추상 메서드고 나머지 하나가 AuthModule의 추상 메서드다.

DefaultApi20는 사용자 계정 API에 관련된 메서드를 별도로 제공하지 않는다. 하지만 AuthModule에서 사용자 정보 확인 공통 메서드를 사용할 때 사용자 계정 API가 반드시 필요하므로 AuthModule의 추상 메서드로 관리한다.

인증 URL 반환 메서드 🔗

네이버 플랫폼 로그인 URL을 반환하는 기능을 구현한다.

우선 API를 살펴보자.


  • 요청

TXT

0GET/POST https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id={:client_id}&redirect_uri={:redirect_uri}&state={:state}
parameter type data required description
{:response_type} path String Y 응답 타입. code로 고정
{:client_id} path String Y API키
{:redirect_uri} path String Y Callback URL
{:state} path String Y 고유 상태값
{:scope} path String 접근 허용 범위로, 사용하지 않음

  • 응답

네이버 플랫폼 로그인 페이지


네이버 플랫폼 로그인 API는 위와 같다. 메서드가 요청의 URL을 반환하도록 설계하면 된다.

문자열 연산으로 URL을 직접 설계할 수도 있지만, service.getAuthorizationUrl() 메서드를 통해 URL을 간편하게 생성할 수 있다.

이미 AuthModule에 공통 메서드로 선언된 게 있으므로, 따로 구현하지 않아도 된다.

접근 토큰 반환 메서드 🔗

로그인 결과로 Code를 전달받으므로 Access Token으로 교환하는 기능을 구현한다.

네이버 API는 아래와 같다.


  • 요청

TXT

0GET/POST https://nid.naver.com/oauth2.0/token?grant_type=authorization_code&client_id={:client_id}&client_secret={:client_secret}&code={:code}&state={:state}
parameter type data required description
{:grant_type} path String Y 인증 타입. authorization_code로 고정
{:client_id} path String Y API키
{:client_secret} path String Y Secret키
{:code} path String Y 인가 코드
{:state} path String 고유 상태값

  • 응답

JSON

0{
1 "access_token": "AAAAQosjWDJieBiQZc3to9YQp6HDLvrmyKC+6+iZ3gq7qrkqf50ljZC+Lgoqrg",
2 "refresh_token": "c8ceMEJisO4Se7uGisHoX0f5JEii7JnipglQipkOn5Zp3tyP7dHQoP0zNKHUq2gY",
3 "token_type": "bearer",
4 "expires_in": "3600"
5}
parameter data description
access_token String 인증 토큰
refresh_token String 리프레쉬 토큰
token_type String 토큰 타입
expires_in String 만료일자 (초 단위)

service.getAccessToken() 메서드의 응답으로 위 JSON 응답의 DTO 객체인 OAuth2AccessToken를 얻을 수 있다.

마찬가지로 AuthModule에 선언된 공통 메서드를 활용하면 되므로, 굳이 구현할 필요 없다.

접근 토큰 갱신 및 반환 메서드 🔗

Access Token은 만료시간이 한시간 정도로 매우 짧다. Access Token이 만료될 경우, 사용자에게 플랫폼 로그인을 통해 인증 정보를 다시 요구해야하지만 Refresh Token이 있다면 별도의 절차 없이 서비스 내부에서 Access Token을 재발급 받을 수 있다.

이 Refresh Token은 인증 권한은 없지만, Access Token을 재발급받는 권한을 가진다.

이를 구현한 네이버 API는 아래와 같다.


  • 요청

TXT

0GET/POST https://nid.naver.com/oauth2.0/token?grant_type=refresh_token&client_id={:client_id}&client_secret={:client_secret}&refresh_token=${:refresh_token}
parameter type data required description
{:grant_type} path String Y 인증 타입. refresh_token로 고정
{:client_id} path String Y API키
{:client_secret} path String Y Secret키
{:refresh_token} path String Y 리프레쉬 토큰

  • 응답

JSON

0{
1 "access_token":"AAAAQjbRkysCNmMdQ7kmowPrjyRNIRYKG2iGHhbGawP0xfuYwjrE2WTI3p44SNepkFXME/NlxfamcJKPmUU4dSUhz+R2CmUqnN0lGuOcbEw6iexg",
2 "token_type":"bearer",
3 "expires_in":"3600"
4}
parameter data description
access_token String 인증 토큰
token_type String 토큰 타입
expires_in String 만료일자 (초 단위)

AuthModule의 공통 메서드로 대체 가능하므로 별도로 구현하지 않는다.

사용자 정보 응답 반환 메서드 🔗

Access Token으로 유저 정보를 호출하는 기능을 구현한다. 발급받은 Access Token을 실제로 유의미하게 쓰는 부분이다.

네이버 API는 아래와 같다.


  • 요청

TXT

0GET https://openapi.naver.com/v1/nid/me
1Authorization: Bearer {:access_token}
parameter type data required description
{:access_token} header String Y 접근 토큰

  • 응답

JSON

0{
1 "resultcode": "00",
2 "message": "success",
3 "response": {
4 "email": "openapi@naver.com",
5 "nickname": "OpenAPI",
6 "profile_image": "https://ssl.pstatic.net/static/pwe/address/nodata_33x33.gif",
7 "age": "40-49",
8 "gender": "F",
9 "id": "32742776",
10 "name": "오픈 API",
11 "birthday": "10-01",
12 "birthyear": "1900",
13 "mobile": "010-0000-0000"
14 }
15}
parameter data description
resultcode String API 호출 결과 코드
message String 호출 결과 메시지
response.id String 동일인 식별 정보 (고유 해쉬값)
response.nickname String 사용자 별명 (없을 경우 id***)
response.name String 사용자 이름
response.email String 사용자 메일 주소 (내 정보의 이메일 주소 기준)
response.gender String 성별 (F - 여성, M - 남성, U - 확인불가)
response.age String 연령대
response.birthday String 생일 (MM-DD)
response.profile_image String 사용자 프로필 사진 URL
response.birthyear String 출생연도
response.mobile String 휴대전화번호

id는 우리가 생각하는 xxx@naver.com 형태의 아이디가 아니라 아이디별로 부여받는 고유 해쉬값이다.

네이버 아이디는 response.email로 얻을 수 있지만, 제한적이다. 만약 [내 정보 - 연락처 이메일]을 다른 메일로 변경했다면 네이버 메일이 아닌 해당 메일이 표시된다. 공식적으로 프로필 API에서 네이버 메일을 확정적으로 얻을 수 있는 방법은 없다.

AuthModule의 공통 메서드로 대체 가능하므로 별도로 구현하지 않는다.

유저 정보 객체 반환 메서드 🔗

네이버의 유저 정보 호출 API 응답 형식에 맞게끔 응답을 파싱하여 UserInfoBean로 반환하는 메서드를 구현한다.

이 프로젝트에선 이름, 이메일, 프로필사진 URL만을 사용하므로, 응답에서 해당 값을 빼내어 객체에 담는다.


  • 코드

JAVA

0@Override
1public UserInfoBean getUserInfoBean(String body) throws JsonProcessingException
2{
3 ObjectMapper mapper = new ObjectMapper();
4
5 JsonNode node = mapper.readTree(body);
6
7 String email = node.get("response").get("email") == null ? "미동의" : node.get("response").get("email").textValue();
8 String name = node.get("response").get("name") == null ? "미동의" : node.get("response").get("name").textValue();
9 String profile_image = node.get("response").get("profile_image") == null ? "/oauth2/assets/images/logo.png" : node.get("response").get("profile_image").textValue();
10
11 return new UserInfoBean(email, name, profile_image, MODULE_NAME);
12}

응답 형식에 맞추어 필요한 값을 추출한다. 만약, 사용자가 정보 제공에 동의하지 않았을 경우 대상 객체가 null을 반환한다. 네이버는 필수/추가에 상관없이 동의/거부를 할 수 있기 때문에 데이터에 대한 null 처리를 반드시 해야한다.

연동 해제 결과 반환 메서드 🔗

네이버 아이디로 처음 로그인을 하면 정보 제공 동의를 수행하는데, 나중에 다시 로그인을 하면 이러한 동의 과정이 생략된다. 즉, 플랫폼에서 첫 로그인 시 정보 제공 동의를 받아 어딘가로부터 저장한다는 뜻이다. 만약 사용자가 서비스로부터 회원 탈퇴를 수행한다면 네이버와의 연동을 해제하여 정보를 완전히 삭제할 필요가 있다.

네이버 API는 아래와 같다.


  • 요청

TXT

0GET/POST https://nid.naver.com/oauth2.0/token?grant_type=delete&client_id={:client_id}&client_secret={:client_secret}&access_token={:access_token}&service_provider=NAVER
parameter type data required description
{:grant_type} path String Y 인증 타입. delete로 고정
{:client_id} path String Y API키
{:client_secret} path String Y Secret키
{:access_token} path String Y 접근 토큰
{:service_provider} path String Y 서비스 제공자. NAVER로 고정

  • 응답

JSON

0{
1 "access_token": "c8ceMEjfnorlQwEisqemfpM1Wzw7aGp7JnipglQipkOn5Zp3tyP7dHQoP0zNKHUq2gY",
2 "result": "success"
3}
parameter data description
access_token String 삭제 처리된 접근 토큰값
result String 처리결과. 성공일 경우 success 반환

  • 코드

JAVA

0@Override
1public boolean deleteInfo(String access) throws IOException, ExecutionException, InterruptedException
2{
3 OAuthRequest oAuthRequest = new OAuthRequest(Verb.GET, getAccessTokenEndpoint());
4 oAuthRequest.addQuerystringParameter("client_id", API_KEY);
5 oAuthRequest.addQuerystringParameter("client_secret", SECRET_KEY);
6 oAuthRequest.addQuerystringParameter("access_token", access);
7 oAuthRequest.addQuerystringParameter("grant_type", "delete");
8 oAuthRequest.addQuerystringParameter("service_provider", "NAVER");
9
10 service.signRequest(access, oAuthRequest);
11
12 Response response = service.execute(oAuthRequest);
13
14 return response.isSuccessful();
15}

구현은 간단하다. OAuthRequest 객체를 활용하면 요청을 쉽게 생성할 수 있다. 응답 자체는 중요하지 않으므로 response.isSuccessful() 메서드로 응답이 정상적인지 여부만 판단하여 boolean으로 반환한다.

정보 제공 동의 갱신 URL 반환 메서드 🔗

서비스 운영 중 추가적인 사용자 정보가 필요하거나 필요 없을 때, 사용자 정보 동의 갱신을 통해 동의 정보를 다시 지정할 수 있다.

API는 아래와 같다.


  • 요청

TXT

0GET/POST https://nid.naver.com/oauth2.0/authorize?auth_type=reprompt&state=${:state}&response_type=code&client_id=${:client_id}&redirect_uri=${:redirect_uri}
parameter type data required description
{:response_type} path String Y 응답 타입. code로 고정
{:client_id} path String Y API키
{:redirect_uri} path String Y Callback URL
{:state} path String Y 고유 상태값
{:auth_type} path String 인증 타입. reprompt로 고정

  • 응답

네이버 플랫폼 정보 제공 동의 페이지


해당 페이지에서 정보 제공 동의여부를 재선택할 수 있다. 이후 로그인과 동일하게 codestate를 리다이렉션 URL로 보낸다. 이후 동작은 로그인과 동일하다.

전체 코드 🔗

JAVA

0package oauth.account.module;
1
2import com.fasterxml.jackson.core.JsonProcessingException;
3import com.fasterxml.jackson.databind.JsonNode;
4import com.fasterxml.jackson.databind.ObjectMapper;
5import com.github.scribejava.core.builder.ServiceBuilder;
6import com.github.scribejava.core.builder.ServiceBuilderOAuth20;
7import com.github.scribejava.core.model.OAuthRequest;
8import com.github.scribejava.core.model.Response;
9import com.github.scribejava.core.model.Verb;
10import oauth.account.bean.ApiKeyBean;
11import oauth.account.bean.UserInfoBean;
12
13import java.io.IOException;
14import java.util.HashMap;
15import java.util.concurrent.ExecutionException;
16
17/**
18 * Naver 인증 모듈 클래스
19 *
20 * @author RWB
21 * @since 2021.09.29 Wed 23:45:49
22 */
23public class NaverAuthModule extends AuthModule
24{
25 private static final String MODULE_NAME = "naver";
26
27 private static final String API_KEY;
28 private static final String SECRET_KEY;
29 private static final String CALLBACK_URL;
30
31 static
32 {
33 ApiKeyBean apiKeyBean = getApiKeyBean(MODULE_NAME);
34
35 API_KEY = apiKeyBean.getApi();
36 SECRET_KEY = apiKeyBean.getSecret();
37 CALLBACK_URL = apiKeyBean.getCallback();
38 }
39
40 private static final ServiceBuilderOAuth20 SERVICE_BUILDER = new ServiceBuilder(API_KEY).apiSecret(SECRET_KEY).callback(CALLBACK_URL);
41
42 private static final NaverAuthModule INSTANCE = new NaverAuthModule(SERVICE_BUILDER);
43
44 /**
45 * 생성자 메서드
46 *
47 * @param serviceBuilder: [ServiceBuilderOAuth20] API 서비스 빌더
48 */
49 private NaverAuthModule(ServiceBuilderOAuth20 serviceBuilder)
50 {
51 super(serviceBuilder);
52 }
53
54 /**
55 * 인스턴스 반환 메서드
56 *
57 * @return [NaverAuthModule] 인스턴스
58 */
59 public static NaverAuthModule getInstance()
60 {
61 return INSTANCE;
62 }
63
64 /**
65 * 유저 정보 객체 반환 메서드
66 *
67 * @param body: [String] OAuth 응답 내용
68 *
69 * @return [UserInfoBean] 유저 정보 객체
70 *
71 * @throws JsonProcessingException JSON 파싱 예외
72 */
73 @Override
74 public UserInfoBean getUserInfoBean(String body) throws JsonProcessingException
75 {
76 ObjectMapper mapper = new ObjectMapper();
77
78 JsonNode node = mapper.readTree(body);
79
80 String email = node.get("response").get("email") == null ? "미동의" : node.get("response").get("email").textValue();
81 String name = node.get("response").get("name") == null ? "미동의" : node.get("response").get("name").textValue();
82 String profile_image = node.get("response").get("profile_image") == null ? "/oauth2/assets/images/logo.png" : node.get("response").get("profile_image").textValue();
83
84 return new UserInfoBean(email, name, profile_image, MODULE_NAME);
85 }
86
87 /**
88 * 연동 해제 결과 반환 메서드
89 *
90 * @param access: [String] 접근 토큰
91 *
92 * @return [boolean] 연동 해제 결과
93 *
94 * @throws IOException 데이터 입출력 예외
95 * @throws ExecutionException 실행 예외
96 * @throws InterruptedException 인터럽트 예외
97 */
98 @Override
99 public boolean deleteInfo(String access) throws IOException, ExecutionException, InterruptedException
100 {
101 OAuthRequest oAuthRequest = new OAuthRequest(Verb.GET, getAccessTokenEndpoint());
102 oAuthRequest.addQuerystringParameter("client_id", API_KEY);
103 oAuthRequest.addQuerystringParameter("client_secret", SECRET_KEY);
104 oAuthRequest.addQuerystringParameter("access_token", access);
105 oAuthRequest.addQuerystringParameter("grant_type", "delete");
106 oAuthRequest.addQuerystringParameter("service_provider", "NAVER");
107
108 service.signRequest(access, oAuthRequest);
109
110 Response response = service.execute(oAuthRequest);
111
112 return response.isSuccessful();
113 }
114
115 /**
116 * 정보 제공 동의 갱신 URL 반환 메서드
117 *
118 * @param state: [String] 고유 상태값
119 *
120 * @return [String] 정보 제공 동의 갱신 URL
121 */
122 @Override
123 public String getUpdateAuthorizationUrl(String state)
124 {
125 HashMap<String, String> params = new HashMap<>();
126 params.put("state", state);
127 params.put("auth_type", "reprompt");
128
129 return service.getAuthorizationUrl(params);
130 }
131
132 /**
133 * 접근 토큰 요청 URL 반환 메서드
134 *
135 * @return [String] 접근 토큰 요청 URL
136 */
137 @Override
138 public String getAccessTokenEndpoint()
139 {
140 return "https://nid.naver.com/oauth2.0/token";
141 }
142
143 /**
144 * 인증 API 요청 URL 반환 메서드
145 *
146 * @return [String] 인증 API 요청 URL
147 */
148 @Override
149 protected String getAuthorizationBaseUrl()
150 {
151 return "https://nid.naver.com/oauth2.0/authorize";
152 }
153
154 /**
155 * 사용자 정보 요청 URL 반환 메서드
156 *
157 * @return [String] 사용자 정보 요청 URL
158 */
159 @Override
160 protected String getUserInfoEndPoint()
161 {
162 return "https://openapi.naver.com/v1/nid/me";
163 }
164}

정리한 전체 코드는 위와 같다.

정리 🔗

이로써 네이버 인증 모듈 구현이 완료됐다. 현재까지는 개발 중 단계라 정해진 아이디로만 사용할 수 있다. API 설정에서 테스트 계정을 등록해야 해당 계정으로 로그인 테스트가 가능하다. 심사 이후 애플리케이션이 승인되면 모든 아이디에서 로그인이 가능하다.