2011-06-15 78 views

回答

3

這是如何檢索來自Twitter的訪問令牌net.oauth.token.v1.AccessToken

首先,你需要從Twitter,你需要你的應用程序註冊到Twitter,並得到一個應用兩兩件事:

  • API密鑰(OAuth的呼籲消費者鍵)
  • API揭祕( OAuth稱其爲消費者機密)。

現在,這裏是我們將如何認證到Twitter:

首先,讓我們有我們的2種方法包含我們的API密鑰&祕密:

private static final String API_KEY = "TWITTER_API_KEY_HERE"; 
private static final String API_SECRET = "TWITTER_API_SECRET_HERE"; 

哦,是的,我們需要一個callback_url

private static final String CALLBACK_URL = "oob"; 

稍後我將解釋oob(出帶外)。

然後,我們需要創建一個消費者,將做OAuth授權給我們:

private OAuth1Consumer consumer = new OAuth1Consumer(API_KEY, API_SECRET, new OAuth1ServiceProvider("https://api.twitter.com/oauth/request_token", "https://api.twitter.com/oauth/authorize", "https://api.twitter.com/oauth/access_token")); 

的參數如下:API密鑰,其次是API祕密,OAuth的服務提供商(包括請求令牌URL,授權令牌URL,訪問令牌URL)。

現在,讓我們的樂趣開始:

申請一個(非授權)請求令牌

爲了獲得一個請求令牌,我們需要從OAuth1Consumer類調​​用requestUnauthorizedToken

RequestToken requestToken = consumer.requestUnauthorizedToken(null, CALLBACK_URL, null, new OAuthHmacSha1Signature()); 

第一個參數是realm,它是空的(因爲Twitter沒有真正使用它),然後是callback_url和簽名方法。

有3個有效的OAuth簽名方法:

  • PLAINTEXT(發送原樣,在明文),OAuthPlainTextSignature類。
  • HMAC-SHA1,類OAuthHmacSha1Signature
  • RSA-SHA1,類OAuthRsaSha1Signature

Twitter使用HMAC-SHA1,請在向其他提供商做OAuth時參考文檔。

現在我們有一個未經授權的請求令牌,讓我們對它進行授權。

一個授權(授權)請求令牌

授權需要用戶去服務提供商網址和登錄,因此我們需要,我們可以在我們的瀏覽器重定向到URL。

String url = consumer.createOAuthUserAuthorizationUrl(requestToken, null); 

(第2個參數是null因爲我們沒有額外的HTTP參數發送通過,但如果這樣做,創建一個Map<String, String>屬性,填補他們和大塊它在方法調用:))

現在我們有URL,查網址到瀏覽器,授權的應用程序,這裏就是callback_url進來:

外的帶外(OOB)授權

OOB授權用於不能執行HTTP重定向但仍希望請求訪問令牌的應用程序。 Twitter表示使用PIN代替HTTP重定向。該密碼(授權Twitter應用程序後顯示)由Twitter作爲瀏覽器上的圖像顯示。有關更多信息,請參閱Twitter OAuth API Documentation

在基於OOB電話,一旦你授權的應用程序,微博向您發送PIN:一旦你看到的針,以獲得訪問令牌,請執行以下操作:

String twitterPin = ""; //Whatever Twitter displayed 
AccessToken accessToken = example.requestAccessToken(new AuthorizedToken(requestToken.getToken(), twitterPin), requestToken); 

在這裏,我們走了。

一旦你調用了你的訪問令牌,真正的訪問令牌值就是AccessToken.getToken()方法。

回調重定向(非OOB)

如果你沒有設置你的callback_urloob,Twitter將返回到您的應用程序與授權令牌授權申請後重定向。我已經創建了一個處理這個過程,所以我們需要我們的OAuthServlet爲我們做這個。

首先,我們需要建立在我們項目的WEB-INF項目oauth-config.xml,像這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<oauth-config> 
<!-- Twitter OAuth Config --> 
     <oauth name="twitter" version="1"> 
       <consumer key="TWITTER_KEY" secret="TWITTER_SECRET" /> 
       <provider requestTokenUrl="https://api.twitter.com/oauth/request_token" authorizationUrl="https://api.twitter.com/oauth/authorize" accessTokenUrl="https://api.twitter.com/oauth/access_token" /> 
     </oauth> 


     <service path="/request_token_ready" class="com.neurologic.example.TwitterOAuthService" oauth="twitter"> 
       <success path="/start.htm" /> 
     </service> 
</oauth-config> 

然後,我們將需要配置我們web.xml包括OAuthServlet

<servlet> 
    <description>An OAuth Servlet Controller</description> 
    <display-name>OAuthServlet</display-name> 
    <servlet-name>OAuthServlet</servlet-name> 
    <servlet-class>com.neurologic.oauth.servlet.OAuthServlet</servlet-class> 
    <init-param> 
     <param-name>config</param-name> 
     <param-value>/WEB-INF/oauth-config.xml</param-value> 
    </init-param> 
    <load-on-startup>3</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>OAuthServlet</servlet-name> 
    <url-pattern>/oauth/*</url-pattern> 
</servlet-mapping> 

現在定義一個Service。該服務將要求我們提供RequestTokenrealm(如果您願意的話)。我的完整源代碼如下。在調用服務之前,我在會話中保存了上面檢索到的請求令牌。

/** 
* 
*/ 
package com.neurologic.example; 

import javax.servlet.http.HttpServletRequest; 

import net.oauth.signature.OAuthSignature; 
import net.oauth.signature.impl.OAuthHmacSha1Signature; 
import net.oauth.token.v1.AccessToken; 
import net.oauth.token.v1.RequestToken; 

import com.neurologic.oauth.service.impl.OAuth1Service; 

/** 
* @author Buhake Sindi 
* @since 31 May 2011 
* 
*/ 
public class TwitterOAuthService extends OAuth1Service { 

    public static final String TWITTER_REQUEST_TOKEN_SESSION = "TWITTER_REQUEST_TOKEN_SESSION"; 
    public static final String TWITTER_ACCESS_TOKEN_SESSION = "TWITTER_ACCESS_TOKEN_SESSION"; 

    /* (non-Javadoc) 
    * @see com.neurologic.oauth.service.impl.OAuth1Service#getOAuthSignature() 
    */ 
    @Override 
    protected OAuthSignature getOAuthSignature() { 
     // TODO Auto-generated method stub 
     return new OAuthHmacSha1Signature(); 
    } 

    /* (non-Javadoc) 
    * @see com.neurologic.oauth.service.impl.OAuth1Service#getRealm() 
    */ 
    @Override 
    protected String getRealm() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    /* (non-Javadoc) 
    * @see com.neurologic.oauth.service.impl.OAuth1Service#getRequestToken(javax.servlet.http.HttpServletRequest) 
    */ 
    @Override 
    protected RequestToken getRequestToken(HttpServletRequest request) { 
     // TODO Auto-generated method stub 
     return (RequestToken) request.getSession().getAttribute(TWITTER_REQUEST_TOKEN_SESSION); 
    } 

    /* (non-Javadoc) 
    * @see com.neurologic.oauth.service.OAuthService#saveAccessToken(javax.servlet.http.HttpServletRequest, java.lang.Object) 
    */ 
    @Override 
    public void saveAccessToken(HttpServletRequest request, AccessToken accessToken) { 
     // TODO Auto-generated method stub 
     request.getSession().setAttribute(TWITTER_ACCESS_TOKEN_SESSION, accessToken); 
    } 
} 

從服務的saveAccessToken()方法是當由Twitter獲得訪問令牌由服務調用的方法(我使用Twitter作爲一個例子,但隨意使用任何服務提供商)。

Servlet通過授權我的請求令牌和檢索訪問令牌來處理握手,而無需編寫額外的流程代碼。

我希望這可以幫助大家!