> Hello World !!!

     

@syaku

트위터 API 인증 : twitter api OAuth Twitter4j

written by Seok Kyun. Choi. 최석균

 Twitter4j 를 이용하여 트위터 API 인증받기(OAuth)

※ Twitter4j 라이브러리를 사용하였으며, 큰 패치가 이루어질 경우 아래의 소스에 문제가 발생할 수 도 있다.

트위터 OAuth 인증을 받기 위해 간단히 흐름을 설명하겠다.
OAuth 인증방식은 대부분 SNS에서 사용하는 거라 익혀두면 유용할 것이다.

1. 트위터 앱을 생성하여 Consumer 토큰을 발급 받는 다.
https://dev.twitter.com/

생성할때 꼭 콜빽(리턴)url을 저장한다. 나는 http://www.test.com/sns_success.jsp 로 하였다.




2. 발급 받은 Consumer 토큰을 이용하여 리퀘스트 토큰과 인증 url을 얻는 다.
여기서 생성되는 토큰은 앱에 등록한 콜백url 로 전송해준다.

3. url 인증 후 리턴된 페이지에서 마무리 작업을 한다. 여기서 액세스토큰을 얻는 데, 이것을 재사용할수 있게 저장해야 한다. 나는 쿠키에 저장하였다.

4. 다시 접속하더라도 한번 인증된 사용자라면 로그인 과정없이 액세스 토큰으로 바로 인증처리한다.

테스트 목적으로 개발된 소스이므로 JSP 로 작성하였고, Twitter4j 라이브러리를 사용하였다.
http://twitter4j.org 다운받으면 되고, 사용한 버전은 2.2.4 이다.


 sns_access.jsp


<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>

<%@ page import="twitter4j.*" %>
<%@ page import="twitter4j.conf.*" %>
<%@ page import="twitter4j.auth.*" %>
<%@ include file="twitter.jsp" %>

<%
  TwitterAPI sns = new TwitterAPI();

  // 트위터 앱 생성후 받은 토큰
  sns.setConsumer_key("********************");
  sns.setConsumer_secret("*************************************");

  HashMap<String,String> mapCookie = (HashMap) setCookies(request.getCookies());

  // 인증받은 토큰
  String access_token = mapCookie.get("_MEI_TWITTER_ACCESS_TOKEN");
  String access_tokensecret = mapCookie.get("_MEI_TWITTER_ACCESS_TOKENSECRET");

  // 재인증여부
  if (access_token != null && access_tokensecret != null) {
    sns.SignIn(access_token,access_tokensecret);

    out.println(sns.twitter.verifyCredentials().getId()); // 사용자 아아디
    out.println(sns.twitter.verifyCredentials().getScreenName()); // 사용자 이름

  } else { // 인증 받은 토큰이 없는 경우

    // 인증 요청 토큰 생성
    sns.getRequestToken();

    String token = sns.requestToken.getToken();
    String tokensecret = sns.requestToken.getTokenSecret();
    String authorizationurl = sns.requestToken.getAuthorizationURL();

    // 생성한 토큰 세션에 저장.
    session.setAttribute("_MEI_TWITTER_REQUEST_TOKEN",token);
    session.setAttribute("_MEI_TWITTER_REQUEST_TOKENSECRET",tokensecret);
    // 인증url 리다이렉트
    response.sendRedirect(authorizationurl);
  }
%>

<%!
  // 쿠키 호출 메서드
  private HashMap setCookies(Cookie[] cookies) {
    HashMap mapRet = new HashMap();

    if(cookies != null){
      for (int i = 0; i < cookies.length; i++) {
        Cookie obj = cookies[i];
        mapRet.put(obj.getName(),obj.getValue());
      }
    }

    return mapRet;
  }

%>


 sns_success.jsp


<%@ page contentType="text/html; charset=utf-8" %>
<%@ include file="twitter.jsp" %>

<%
  // 트위터에서 받은 인증토큰
  String oauth_token = request.getParameter("oauth_token"); // request_token 토큰과 같은 값이여야 한다. (보안)
  String oauth_verifier = request.getParameter("oauth_verifier"); // 트위터에서 인증요청하면서 생성한 토큰

  // 세션에 저장했던 토큰
  String request_token = (String) session.getAttribute("_MEI_TWITTER_REQUEST_TOKEN");
  String request_tokensecret = (String) session.getAttribute("_MEI_TWITTER_REQUEST_TOKENSECRET");

  // 보안상 토큰이 일치하는 지 비교.
  if (request_token.equals(oauth_token)) { 

    TwitterAPI sns = new TwitterAPI();
    sns.setConsumer_key("************");
    sns.setConsumer_secret("***********************");

    // 인증된 토큰 생성
    sns.getAccessToken(request_token,request_tokensecret,oauth_verifier);
    
    // 인증된 토큰을 변수에 담는다.
    String access_token = sns.accessToken.getToken();
    String access_tokensecret = sns.accessToken.getTokenSecret();

    // 인증된 토큰을 쿠키에 저장. 다시 접속할 경우 로그인과정없애기 위해. 재인증.
    Cookie cookie;
    cookie = new Cookie("_MEI_TWITTER_ACCESS_TOKEN",access_token);
    cookie.setMaxAge(60*60*24);    // 하루
    response.addCookie(cookie);

    cookie = new Cookie("_MEI_TWITTER_ACCESS_TOKENSECRET",access_tokensecret);
    cookie.setMaxAge(60*60*24);    // 하루
    response.addCookie(cookie);

    // 완료되면 생성한 세션 제거함.

  }

%>


 twitter.jsp


<%@ page contentType="text/html; charset=utf-8" %>

<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>

<%@ page import="twitter4j.*" %>
<%@ page import="twitter4j.conf.*" %>
<%@ page import="twitter4j.auth.*" %>

<%!
/*
 * Copyright (c) 2010, MEI By Seok Kyun. Choi. (최석균)
 * http://syaku.tistory.com
 * 
 * GNU Lesser General Public License
 * http://www.gnu.org/licenses/lgpl.html
 */

public class TwitterAPI {

  private String consumer_key;
  public void setConsumer_key(String consumer_key) {this.consumer_key = consumer_key; }
  private String consumer_secret;
  public void setConsumer_secret(String consumer_secret) {this.consumer_secret = consumer_secret; }

  private RequestToken requestToken = null;
  private AccessToken accessToken = null;
  private Twitter twitter = null;

  public TwitterAPI() {
    twitter = new TwitterFactory().getInstance();
  }

  // 인증 요청 토큰 생성
  public void getRequestToken() throws Exception{
    twitter.setOAuthConsumer(this.consumer_key, this.consumer_secret);
    requestToken = twitter.getOAuthRequestToken();
  }

  // 인증된 토큰 생성
  public void getAccessToken(String request_token,String request_tokensecret,String oauth_verifier) throws Exception {
    try {
      twitter.setOAuthConsumer(this.consumer_key, this.consumer_secret);
     accessToken = twitter.getOAuthAccessToken(new RequestToken(request_token, request_tokensecret),oauth_verifier);
    } catch (TwitterException te) {
      System.out.println(" >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+ te);
    }

    twitter.setOAuthAccessToken(accessToken);

    System.out.println(twitter.verifyCredentials().getId()); // 사용자 아이디
    System.out.println("???????????????token : " + accessToken.getToken());
    System.out.println("???????????????tokenSecret : " + accessToken.getTokenSecret());
  }

  // 재인증 처리
  public void SignIn(String access_token,String access_tokensecret) throws Exception {
    twitter.setOAuthConsumer(this.consumer_key, this.consumer_secret);

    System.out.println("???????????????access_token : " + access_token);
    System.out.println("???????????????access_tokensecret : " + access_tokensecret);

    twitter.setOAuthAccessToken(new AccessToken(access_token,access_tokensecret));
    // 사용자 아이디
    System.out.println("??????????????????" + twitter.verifyCredentials().getId());
  }

}
%>



posted syaku blog

Syaku Blog by Seok Kyun. Choi. 최석균.


http://syaku.tistory.com