2015. 12. 17. 15:00

사실 대부분의 'OAuth'인증은 웹을 통해서만 하므로 애플리케이션이던 웹이던 처리에는 크게 차이가 없다는 게....

(제가 모르는 건인지 자료를 못 찾은 건지 ㅡ.-;;)

 

어찌 됐건 C#애플리케이션을 통해 네이버에서 'OAuth'로그인을 하도록 하겠습니다.

로그인이 잘되었는지 확인하기 위해 접근 토큰(Access Token, 액세스 토큰)을 발급받아 블로그의 카테고리를 조회해 보도록 하겠습니다.

 

 

0. 네이버 'OAuth'로그인 절차

애플리케이션에서 네이버 'OAuth'인증을 하기 위해서는 웹 브라우저를 사용할 수 있는 컨트롤이 필요합니다.

로그인 인터페이스가 웹으로만 되어 있으므로 웹 브라우저 컨트롤(C#에서는 'WebBrowser' 컨트롤)을 이용하여 사용자에게 네이버 로그인을 유도하고 로그인 결과를 'GET'나 'JSON'으로 받아 사용합니다.

 

문제는 이렇게 인증받은 코드(code)는 로그인 한 것이 맞지만 이 코드를 이용하기 위해서는 접근 토큰(Access Token)을 따로 발급받아야 합니다.

 

그렇므로 이 글은 원래 인증 코드만 받으면서 마무리할 생각이엇지만 인증코드의 유효성을 확인하기 위해 접근 토큰까지 발급받아 블로그의 카테고리를 조회하는 것까지 다루겠습니다.

 

 

1. 네이버에 프로젝트 등록하기

네이버의 'OAuth'인증을 사용하려면 네이버 개발자 센터에 프로젝트(애플리케이션)이 등록되어 있어야 합니다.

 

 

1)

네이버 개발자센터(http://developer.naver.com/) > 오픈API > 네이버 로그인

으로 들어가 '네아로(네이버 아이디 로그인 ) 개발자'로 이동합니다.

 

 

2)

내 애플리케이션 > 새 애플리케이션 등록

을 선택합니다.

 

 

3)

애플리케이션의 정보를 입력합니다.

애플리케이션 이름 : 로그인할 때 화면에 표시되는 이름입니다. 한글도 가능합니다.

카테고리 : 애플리케이션의 용도를 설정합니다.

 

서비스 환경 : 우리는 'Windows App'를 선택해 줍니다.

뭐...다른걸 선택해서 생성해도 크게 차이가 없습니다.

입력할 내용이 좀 다르긴 한데 결과적으로는 다 똑같습니다.

단지 'Web'과 'Windows App'의 경우 '다운로드 URL'과 'Callback URL'의 호스트(Host)가 다른 경우 네이버의 로그인 API사용 허가가 안 나거나 로그인 허가는 나는데 액세스 토큰은 허가가 안 나는 경우가 있습니다.

 

다운로드 URL : 프로그램을 다운로드할 수 있는 URL입니다.(서비스 하는 웹페이지의  URL을 입력하셔도 됩니다.)

Callback URL : 로그인 허가가 난 경우 콜백받을 URL입니다.

'Windows App'인경우 웹서버가 없으므로 이곳에서 문제가 생길 수 있습니다.

이럴 때는 자신의 블로그나 홈페이지 같이 외부에서 접속가능한 주소를 적어주시면 됩니다.

이것을 웹 브라우저컨트롤에서 읽어들여 작업하는 것이 가능합니다.

 

모든 항목을 입력하셨으면 약관에 동의한 후 확인을 누릅니다.

 

 

2. 클라이언트 키 확인하기

내 애플리케이션 > [생성한 애플리케이션 이름]

을 선택하시면 등록한 애플리케이션의 정보를 확인할 수 있습니다.

여기서 클라이언트 아이디(Client ID)와 클라이언트 시크릿(Client Secret)을 확인할 수 있습니다.

이 키를 이용하여 애플리케이션에서 로그인 요청을 할 수 있습니다.

 

 

3. C#에서 'OAuth'인증 하기

.Net의 웹 브라우저(WebBrowser) 컨트롤을 이용하여 네이버 'OAuth'로그인 폼을 호출하고 로그인 결과를 콜백URL로 받게 됩니다.('GET'방식으로 받게 됨)

 

3-1. UI 구성하기

결국 로그인을 하려면 네이버의 웹페이지에 접속해야 하므로 UI에 웹브라우저 컨트롤이 있어야 합니다.

 

아래 디자이너에서 'Login'버튼을 누르면 웹브우저 컨트롤에 로그인 페이지를 표시해주고 리턴받은 값을 'Authentication Result'에 받습니다.

 

 

3-2. 요청 URL 만들기

네이버에서 제공하는 로그인 인증용 url에 'GET' 방식으로 쿼리를 붙여 요청용 URL을 완성해야 합니다.

(참고 : 네아로 개발자 센터 - 네이버 아이디로 로그인 API 명세)

 

API 명세에 '1. 네이버 아이디로 로그인 인증 요청'을 보면

요청 URL : https://nid.naver.com/oauth2.0/authorize

파라미터 : 'response_type', 'client_id', 'redirect_uri', 'state'

로 되어 있습니다.

 

아래와 같은 방법으로 인증용 URL을 완성해 봅시다.

string ClientID = [1번에서 등록할때 받은 클라이언트 아이디];
string ClientSecret = [1번에서 등록할때 받은 클라이언트 시크릿];
string RedirectURL = [1번에서 등록할때 넣은 콜백URL];
 
//확인용 키 생성
string State = (new Random()).Next().ToString();
 
//인증요청용 전체 URL(쿼리 포함) 생성
NameValueCollection listAuthURL_QueryString
    = HttpUtility.ParseQueryString(string.Empty);
listAuthURL_QueryString["response_type"] = "code";
listAuthURL_QueryString["client_id"] = ClientID;
listAuthURL_QueryString["redirect_uri"] = RedirectURL;
listAuthURL_QueryString["state"] = State;
 
string AuthURL = "https://nid.naver.com/oauth2.0/authorize?"
    + listAuthURL_QueryString.ToString();

 

'NameValueCollection'를 'HttpUtility.ParseQueryString()'으로 인스턴스를 만들면 'GET'방식을 사용할 때 필요한 쿼리스트링을 컬렉션으로 만들어 관리할 수 있습니다.

 

위 코드를 통해 완성된 URL의 예는 다음과 같습니다.

예> https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id=[1번에서 등록할 때 받은 클라이언트 아이디]&redirect_uri=[1번에서 등록할때 넣은 콜백URL]&state=1162353973

 

3-3. 로그인 하기

이제 '3-2.'에서 만든 URL로 접속하면 로그인 페이지가 표시되게 됩니다.

우리는 웹브라우저 컨트롤에 로그인 페이지를 표시할 것이기 때문에 위 URL을 웹브라우저 컨트롤로 보내줍니다.

//인증 시작
webBrowser.Navigate(new Uri(base.AuthURL));

 

위 코드를 실행하면 웹브라우저에 다음과 같이 로그인 페이지가 표시됩니다.

이제 직접 네이버 아이디에 로그인하시면 됩니다.

 

오류 페이지

여기서 만약 오류페이지가 표시된다면

클라이언트 아이디, 콜백URL 잘못됐거나

등록한 애플리케이션이 제거 되거나 정지당했을 확률이 매우 높습니다.

보통은 오타인 경우가 많습니다 ㅎㅎㅎ

 

3-4. 결과값 받기

이제 사용자가 로그인을 완료하면 입력한 콜백URL에 'GET'방식으로 응답 파라미터가 넘어오게 됩니다.

예> http://blog.danggun.net/?code=[생성된 코드]&state=913431611

 

이제 이걸 파싱해서 데이터로 사용하면 됩니다.

 

파싱할때도 'NameValueCollection'를 'HttpUtility.ParseQueryString([받은 쿼리])'로 초기화하면 편하게 파싱할 수 있습니다.

//쿼리 파싱
NameValueCollection query = HttpUtility.ParseQueryString(webBrowser.Url.Query);

오류 없이 정상적으로 코드가 넘어왔다면 로그인은 완료 된 것입니다.

 

 

4. 접근 토큰 얻기

이제 위에서 받은 로그인 코드를 확인하기 위해 접근 토큰(Access Token, 액세스 토큰)을 발급받아 보겠습니다.

이 접근 토큰이 있어야 비로소 네이버API에서 제공하는 다양한 기능을 사용할 수 있습니다.

 

4-1. 요청 URL세팅하기

네이버에서 제공하는 '접근 토큰 발급 요청 URL'에 'GET' 방식으로 쿼리를 붙여 요청용 URL을 완성해야 합니다.

(참고 : 네아로 개발자 센터 - 네이버 아이디로 로그인 API 명세)

 

API 명세에 '2. 접근 토큰 발급 요청'을 보면

요청 URL : https://nid.naver.com/oauth2.0/token

파라미터 : 'grant_type', 'client_id', 'client_secret', 'code String', 'state'

로 되어 있습니다.

 

이제부터는 콜백URL이 없고 'JSON'형태로 결과가 리턴되게 됩니다.

그러므로 웹브라우저 컨트롤을 사용할 필요는 없고 바로 'WebClient'를 통해 요청 및 결과를 리턴 받습니다.

 

'WebClient'의 인스턴스를 만들고 아래와 같이 쿼리를 세팅합니다.

WebClient webClient;
 
string sAccessToken_Url = "https://nid.naver.com/oauth2.0/token";
 
//쿼리 세팅
webClient = new WebClient();
webClient.QueryString.Add("grant_type", "authorization_code");
webClient.QueryString.Add("client_id", [1번에서 등록할때 받은 클라이언트 아이디]);
webClient.QueryString.Add("client_secret", [1번에서 등록할때 받은 클라이언트 시크릿]);
webClient.QueryString.Add("code", [3번에서 받은 'code'값] );
webClient.QueryString.Add("state", State);

 

 

4-2. 요청하고 데이터 받기

이제 'webClient.OpenRead()'를 호출하게 되면 결과가 'JSON'으로 오게 됩니다.

//요청
Stream stream = webClient.OpenRead(sAccessToken_Url);
//결과 받기
String sResultJson = new StreamReader(stream).ReadToEnd();

 

이제 'sResultJson'를 'JSON'형태로 파싱하면 'access_token'을 받을 수 있습니다.

예>

{
"access_token":"[받은 액세스 토큰]",
"refresh_token":"[리플래시 토큰]",
"token_type":"bearer",
"expires_in":"3600"
}

 

에러가 넘어 온다면?

여기서 에러가 넘어오면 거의 '024'에러 일 것입니다.

 

'024'에러는 인증이 실패한 것인데 원인은

1) 오타(공백이 잘못들어간 경우도 포함됩니다.)

2) 로그인하고 받은 로그인 코드(code)의 기간 만료

3) 클라이언트 아이디 불일치

4) 클라이언트 시크릿 불일치

거의 이런 원인일 것입니다.

 

 

5. 블로그 카테고리 얻기

이제 '4.'에서 얻은 접근 코드를 사용하여 네이버 블로그 카테고리 조회 API에서 리스트를 받도록 하겠습니다.

 

5-1. 요청 만들기

네이버에서 제공하는 '블로그 카테고리 조회 API'의 URL에 'GET' 방식으로 쿼리를 붙여 요청용 URL을 완성합니다.

(참고 : 네아로 개발자 센터 - 블로그 글쓰기 API 명세)

 

API 명세에 '2. 블로그 카테고리 조회 API'을 보면

요청 URL : https://openapi.naver.com/blog/listCategory.json

파라미터 : 'blogId'

로 되어 있습니다.

 

'접근 코드'때와 마찬가지로 결과는 'JSON'으로 넘어오므로 'WebClient'를 이용하여 요청을 보내겠습니다.

여기서 주의 할점은 접근 토큰은 헤더에 'Authorization'으로 심어야 하며 'Bearer '로 시작해야 합니다.

WebClient webClient;
 
string sListCategoryApiUri = "https://openapi.naver.com/blog/listCategory.json";
string sBlogID = "c1dong8";
 
webClient = new WebClient();
webClient.Headers.Add("Authorization", "Bearer " + [4번에서 받은 접근 토큰]);
webClient.QueryString.Add("blogId", sBlogID);

 

5-2. 호출하고 결과 받기

이제 'WebClient.OpenRead()'를 통해 데이터를 요청하고 결과를 받습니다.

결과는 'JSON'으로 옵니다.

//요청
Stream stream = webClient.OpenRead(sListCategoryApiUri);
//결과 받기
string responseJSON2 = new StreamReader(stream).ReadToEnd();

 

 

 

마무리

이거....알고나면 별거 아닌데 C#예제 찾기가 힘들어서 직접 만들어 봤습니다.

실수로 로그인코드와 접근 토큰을 착각하는 바람에 3일을 삽질했는데 API문서를 다시 보니까.....아 잰장 ㅋㅋㅋㅋㅋ

뭐 그러면서 배우는 거죠 ㅎㅎ

 

'Visual Studio 2015'용 프로젝트 입니다.

OAuth_Login.zip
다운로드