'기타/API'에 해당되는 글 1건

Oauth를 사용하여(JSP) Daum Blog API 사용하기 2010.09.13

Oauth를 사용하여(JSP) Daum Blog API 사용하기

Published on: 2010.09.13 17:10 by krespo

Oauth를 사용하여 Daum Blog API tutorial을 진행해 보겠습니다.
(eclipse 와 signpost library를 통해 진행해도록 하겠습니다.)

1. Oauth 준비 단계
1) Eclipse의 메뉴에서 File -> new -> Dynamic Web Project 를 선택하여 프로젝트를 생성해 줍니다.
(저는 OAuthTutorial란 이름으로 프로젝트를 생성 했습니다.)

2) OAuth를 사용하기 위한 라이브러리 들을 추가 합니다.
     - Signpost library
     - commons-codec-1.4.jar (signpost와 의존관계)
     - JDOM library (Blog API를 사용하기 위한 xml parser - build/jdom.jar 파일 추가)


<signpost-core-1.2.1.1.jar를 다운로드>

3) 다운로드 받은 라이브러리 파일들을 해당프로젝트의 WEB-INF/lib파일에 복사하여 붙여 넣기 해주세요.



4) OAuth를 사용하기 위해서는 "Consumer Key" 와 "Consumer Secret"을 발급 받아야 합니다.  컨슈머등록하기

<컨슈머 등록 창>
- 이름 : Oauth를 사용할 서비스 이름
- 설명 : Oauth를 사용할 어플리케이션에 대한 설명(간단하게 작성)
- 연동 서비스: Oauth를 통해 Blog API를 사용할 것이기 때문에 Blog에 체크해 줍니다.
- 서비스 형태 : 웹 전용으로 만들것이라면 "웹서비스" 를, 아이폰이나 안드로이드 용 같은 어플리케이션 형태라면 "모바일/데스크탑" 을 선택합니다.
- 서비스 권한 : 보통 "읽기/쓰기" 형태를 선택합니다.

- CallBack 경로 : 위에서 서비스 형태를 선택 했을때 "웹서비스" 를 선택 하셨다면 반드시 CallBack 경로를 입력해 주셔야 합니다.
                         만약 "모바일/데스크탑"을 선택하셨다면 입력하시지 않으셔도 됩니다.
                         예) http://localhost/OauthTutorial/callback.jsp
- 서비스 URL : 서비스 되고 있는 URL을 입력해 주시면 됩니다.
                      예) http://localhost/OauthTutorial/index.jsp
-서비스 정보 : 서비스에 대한 내용을 간단히 입력하시면 됩니다.


<컨슈머 등록 예>

5) "등록"을 누르시면 컨슈머 등록이 완료 되었다는 메시지가 나옵니다. "컨슈머 관리" 탭을 누르면 컨슈머 등록이 된것을 확인할 수 있습니다.


"인증정보" 탭의 "보기"를 선택하시면 발급받은 "컨슈머 토큰"과 "컨슈머 시크릿"을 확인 하실 수 있습니다.


발급받은 Key와 secret을 통하여 Oauth 인증을 사용해 보겠습니다.

6) 컨슈머 키와 컨슈머 시크릿은 인증에 자주 사용하는 내용임으로 OauthUtil 이라는 클래스를 만들어 따로 관리 하도록 하겠습니다.



다음과 같이 OauthUtil 클래스에 발급 받은 consumer key 와 consumer secret을 상수로 선언합니다.
아래의 URL들은 Oauth인증에 사용할 URL이기 때문에 이또한 Util class에 저장해 둡니다.

URL은 좌측 Oauth의 소개 메뉴에서 다음과 같이 확인 하실 수 있습니다.



2. Oauth 인증

Oauth인증은 크게 다음과 같은 단계로 이루어 집니다.

1) 컨슈머 키와 컨슈머 시크릿을 통해서 리퀘스트 토큰을 얻습니다.
2) 획득한 리퀘스트 토큰을 통해 다음 로그인 창으로 이동하여 로그인을 합니다.
3) 로그인이 완료된 후에 컨슈머 등록시에 입력하였던 callback URL로 oauth_verifier를 가지고 이동합니다.
4) 이때 callback URL에서 oauth_verifier를 획득한후 Access Token URL로 요청하면 access token과 access token secret을 받아 옵니다.

1)Consumer Key와 Consumer Secret을 통해서 request Token을 획득
① 이클립스 프로젝트의 WebContent 아래 index.jsp 를 생성합니다.
//index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="oauth.signpost.signature.HmacSha1MessageSigner"%>
<%@page import="com.sun.crypto.provider.HmacSHA1"%>
<%@page import="oauth.signpost.OAuthConsumer"%>
<%@page import="oauth.signpost.basic.DefaultOAuthConsumer"%>
<%@page import="net.oauthtutorial.util.OauthUtil"%>
<%@page import="oauth.signpost.OAuthProvider"%>
<%@page import="oauth.signpost.basic.DefaultOAuthProvider"%>
<%
     OAuthConsumer consumer = new DefaultOAuthConsumer(OauthUtil._CONSUMER_KEY,
                                                       OauthUtil._CONSUMER_SECRET);
     OAuthProvider provider = new DefaultOAuthProvider (OauthUtil._REQUEST_TOKEN_URL,
                                                        OauthUtil._ACCESS_TOKEN_URL,
                                                        OauthUtil._AUTHORIZE_URL);
     
     //consumer 객체와 consumer 등록시 등록했던 callback URL을 입력	
     String oauthURL = provider.retrieveRequestToken
                                (consumer, "http://localhost/OauthTutorial/callback.jsp");
	
     //생성도니 consumer객체와 provider객체를 세션에 저장한다.
     session.setAttribute("consumer", consumer);
     session.setAttribute("provider", provider);

     //Daum login 창으로 Redirect	
     response.sendRedirect (oauthURL);
	
%>


이렇게 하면 맨 마지막 줄의 response.sendRedirect를 통해 Daum 로그인 창으로 이동하게 됩니다.

http://localhost/OauthTutorial/index.jsp로 접속하게 되면 redirect되어 다음과 같은 모습을 확인할 수 있습니다.


여기서 로그인 버튼을 누르면 로그인 창으로 이동합니다.


다음의 아디이와 비밀번호를 입력하고 로그인을 시도합니다.
로그인이 되면 다음과 같은 페이지를 보실수 있습니다.


다음과 같이 로그인이 된것을 확인 할 수있습니다. 이 페이지 상태에서 "확인"을 누르게 되면 처음에 만들었던 index.jsp의 callback URL로 페이지가 이동하게 됩니다. Callback URL로 이동할때 AccessToken을 얻기 위해서 필요한 oauth_verifier를 parameter로 전달하게 되는데 이 parameter를 받아 AccessToken과 AccessTokenSecret을 생성해 주면 됩니다.



② oauth_verifier파라이터를 받아서 AccessToken을 받을 callback.jsp를 생성합니다.
//callback.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="oauth.signpost.OAuthConsumer"%>
<%@page import="oauth.signpost.OAuthProvider"%>
<%@page import="oauth.signpost.basic.DefaultOAuthConsumer"%>
<%@page import="oauth.signpost.basic.DefaultOAuthProvider"%>
<%@page import="net.oauthtutorial.util.OauthUtil"%>
<%
	//parameter로 전달된 oauth_verifier를 저장
	String oauthVerifier = request.getParameter("oauth_verifier");
	
	OAuthConsumer consumer = (DefaultOAuthConsumer)session.getAttribute("consumer");
	OAuthProvider provider = (DefaultOAuthProvider)session.getAttribute("provider");	
	
	if(oauthVerifier != null) {
		//파라미터로 전달된 oauth_verifier를 통해서 access Token을 생성합니다.
		provider.retrieveAccessToken(consumer, oauthVerifier.trim());
		
		//getToken() method로 생성된 accessToken을 가져오고, 
		//getTokenSecret() method로 accessTokenSecret을 가져와 session에 저장
		session.setAttribute("accessToken", consumer.getToken());
		session.setAttribute("accessTokenSecret", consumer.getTokenSecret());
	}
	
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<a href="http://localhost/OauthTutorial/blogInfo.jsp">블로그 카테고리 가져오기</a><br/><br/>
Access Token : <%=consumer.getToken() %><br/>
Access Token Secret : <%=consumer.getTokenSecret() %>
</body>
</html>


위와 같이 AccessToken과 AccessTokenSecret을 발급 받을수 있습니다.

<실행화면>
이렇게 발급 받은 AccessToken 과 AccessTokenSecret은 인증시(로그인) 매번 바뀌지 않고 계속 일정한 값을 유지합니다.
그렇기 때문에 한번 발급 받은 AccessToken과 AccessTokenSecret을 DB에 저장하거나 프로그램 상의 상수 값으로 고정시켜 로그인 과정없이
API를 사용할 수 있습니다.

③ 발급받은 AccessToken을 사용하여 Blog API 사용하기
위의 callback.jsp에서 블로그 카테고리 가져오기를 클릭하면 블로그 API를 통해 카테고리 목록을 가져와 보겠습니다.
위의 jsp와 같은 경로로 blogInfo.jsp를 생성합니다.
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="net.oauthtutorial.vo.BlogCategoryVO"%>
<%@page import="net.oauthtutorial.util.OauthUtil"%>
<%@page import="org.jdom.input.SAXBuilder"%>
<%@page import="org.jdom.Document"%>
<%@page import="org.jdom.Element"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.net.URLConnection"%>
<%@page import="java.net.URL"%>
<%@page import="oauth.signpost.OAuthConsumer"%>
<%@page import="oauth.signpost.basic.DefaultOAuthConsumer"%>
<%@page import="java.net.HttpURLConnection"%>
<%
	OAuthConsumer consumer = new DefaultOAuthConsumer(OauthUtil._CONSUMER_KEY,           
                                                          OauthUtil._CONSUMER_SECRET);	
	//앞서 발급받아 session에 저장시킨 access token와 access token secret을 가져와
	//다른 인증 작업없이 setTokenWithSecret method를 통하여 인증처리
	consumer.setTokenWithSecret((String)session.getAttribute("accessToken"), 
                                    (String)session.getAttribute("accessTokenSecret"));
	
	//JDOM Library를 사용하여 xml parsing
	SAXBuilder builder = new SAXBuilder();
	Document doc = null;
	Element root = null;
	
	//정보를 가져올 블로그 이름
	String blogName = "블로그이름";
	
	//category 정보들을 담을 List 객체
	List<BlogCategoryVO> categories = new ArrayList<BlogCategoryVO>();

	URL url = new URL("http://apis.daum.net/blog/category/list.do?blogName=" + blogName);
	
	HttpURLConnection req = (HttpURLConnection) url.openConnection();
	req.setRequestProperty("Content-type", "text/xml; charset=UTF-8");
	
	try {
		consumer.sign(req);
	}catch (Exception e){
		e.printStackTrace();
	}
	req.connect();
	
	if( req.getResponseCode() == 200) {
		
		doc = builder.build(req.getInputStream());
		root = doc.getRootElement();
		
		@SuppressWarnings("unchecked")
		List<Element> items = root.getChild("items").getChildren("item");
		
		for(Element em : items ) {
			BlogCategoryVO categoryVO = new BlogCategoryVO();

			categoryVO.setCategoryId(Integer.parseInt(
                                                 em.getChild("categoryId").getValue()
                                                 ));
			categoryVO.setOpen(em.getChild("open").getValue());
			categoryVO.setName(em.getChild("name").getValue());
			
			categories.add(categoryVO);
		}
	}
	
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1" width="500">
	<tr>
		<td>카테고리아이디</td><td>공개</td><td>이름</td>
	</tr>
	<%for ( BlogCategoryVO bc : categories) {%>
		<tr>
			<td><%=bc.getCategoryId() %></td>
			<td><%=bc.getOpen() %></td>
			<td><%=bc.getName() %></td>
		</tr>
	<%} %>
</table>
</body>
</html>
<SPAN id=tx_marker_caret></SPAN>


위와 같은 방식으로 발급된 AccessToken 과 AccessTokenSecret을 통해서 재인증 과정없이 바로 블로그 API를 사용할 수 있습니다.
이때 블로그 API 요청시 필수 파라미터인 blogName은 자신의 블로그 주소중
http://blog.daum.net/blogName/ <- 이부분을 입력해 주면 됩니다.



이런 결과를 확인 하실수 있습니다.

이상으로 Oauth + Daum blog API를 사용해 보았습니다. 함께 업로드한 소스코드와 함께 확인하시면 더 쉽게 사용하실 수 있을 겁니다.

OauthTutorial.war

신고

'기타 > API' 카테고리의 다른 글

Oauth를 사용하여(JSP) Daum Blog API 사용하기  (11) 2010.09.13
무제 | 2010.09.28 12:37 신고 | PERMALINK | EDIT/DEL | REPLY
좋은정보감사해요~
krespo | 2010.09.29 15:07 신고 | PERMALINK | EDIT/DEL
댓글 감사합니다~^^ 너무 댓글이 없어서 블로그가 죽어가고 있는 참이에요~ㅎㅎ
사고뭉치 | 2010.12.14 15:09 신고 | PERMALINK | EDIT/DEL | REPLY
이렇게 좋은 블로그가 죽어가다니 그래선 아니됩니다.
krespo | 2010.12.17 14:14 신고 | PERMALINK | EDIT/DEL
ㅎㅎ 감사합니다~^^
곽범생 | 2011.01.30 12:50 신고 | PERMALINK | EDIT/DEL | REPLY
좋은정보 잘보고갑니다. ㅎㅎ
krespo | 2011.01.31 11:50 신고 | PERMALINK | EDIT/DEL
넵 감사합니다~^^ 자주 놀러와 주세요~ㅎㅎ
초보자 | 2011.04.07 23:18 신고 | PERMALINK | EDIT/DEL | REPLY
안녕하세요^^ 정말 친절하게 설명해주셨는데....
중간에 막혀서 이렇게 댓글 남겨요 ㅜㅜ

중간에 아이디인증을 하기위해
http://localhost/OauthTutorial/index.jsp
로 들어가면 리다이렉션되어 창이 뜨신다고하셨는데...
맨위쪽에서 OAuth 만들때 자기가 서비스URL작성했던부분을
실행시키면 아이디인증 창이 떠야되는거맞나요?
전 해도 찾을수없는페이지라고해서 안되서요...막히는데 제 질문 이해하셨는진 모르겠네요 ㅜㅜ
krespo | 2011.04.08 14:35 신고 | PERMALINK | EDIT/DEL
음.. 꼭 OAuth Consumer key를 발급받을때 입력하셨던 서비스 URL 은 서비스 URL 아무거나 입력하시면 됩니다.. 즉 서비스 URL은 컨슈머키를 발급 받는데 중요한 요소는 아니라는 말이죠~ 사실은 컨슈머키 발급 받을때 입력하는 서비스 url은 구체적이지 않아도 됩니다.
그냥 http://localhost/OAuthTutorial 이라고 입력하셔도 됩니다.
즉 서비스 URL은 컨슈머키 발급과 구체적으로 관련이 있지는 않습니다.(그래도 관련있는 URL을 입력해주시는게 좋겠죠.^^ )

아마 초보자 님께서는 이 서비스 URL로 접근하면 로그인 창으로 가야 하는것이 아니냐 라고 말씀하시는것 같은데 그건 아니구요~
(저는 작업하다 보니 컨슈머키를 발급받을 때 입력한 서비스 URL과 RequestToken을 얻는 페이지 URL이 똑같아서 혼란을 일으키게 만든것 같네요~^^;; 죄송합니다.ㅎㅎ)

인증 창으로 redirect 시키기 위한 URL은 "컨슈머키 생성하실때 입력한 서비스 URL" 이 아닌 포스팅에 2번에 1) 번의 코드가 작성된 페이지로 접근하시면 됩니다.~~^^

아마 초보자 님께서는 다른 경로로 저 코드를 작성하셨을테니까 찾지 못하는것입니다. 초보자 님께 맞는 URL로 접근하시면 리다이렉트가 일어나 로그인창을 보실수 있을것 같아요~

이상 답변이 되었는지 모르겠네요~

또 안되시거나 하시면 다시 글 남겨주시면 다시 알려드리도록 할께요~^^
Taoist | 2011.05.23 15:52 신고 | PERMALINK | EDIT/DEL | REPLY
정말 감사합니다 좋은 포스팅 덕분에 인증 성공했네요
krespo | 2011.05.23 18:50 신고 | PERMALINK | EDIT/DEL
별말씀을요~ㅎㅎ 제 허접한 포스팅이 Taoist 님께 도움이 되었다니 제가 다 기쁘네요~^^
utube | 2011.06.02 05:46 신고 | PERMALINK | EDIT/DEL | REPLY
우수 게시물은 서면으로 시간을 보내게 될거야이
Name
Password
Homepage
Secret