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
-서비스 정보 : 서비스에 대한 내용을 간단히 입력하시면 됩니다.
- 설명 : 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과 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를 사용해 보았습니다. 함께 업로드한 소스코드와 함께 확인하시면 더 쉽게 사용하실 수 있을 겁니다.