2010-12-07 41 views
5

我在這裏看到了太多的問題,詢問OAuth以及如何使用OAuth協議連接到Facebook Graph API或Twitter API。JOAuth,一個基於java的OAuth 1(最終)和OAuth 2(草案10)庫。我如何使用它?

我發現了JOAuth(來自Google Code),我想知道我該如何使用它? JOAuth提供了哪些其他功能,並且與其他java oauth庫一樣好?

+0

請定期檢查是否有新更新(剛更新了圖書館),如果可能,請提供反饋。 – 2011-03-10 12:29:12

回答

13

看到我寫了JOAuth,我認爲在SO上回答這個問題是適當的。我沒有找到讓這個問題成爲社區wiki的選項。 :(

我不在這裏討論OAuth Authorization。有專門針對這各種網站。

JOAuth配備了一個奇妙的功能,它具有控制OAuthServlet,管理您的HTTP重定向從響應。服務提供商 配置OAuthServlet到Web應用程序的方式,簡單地聲明爲<servlet>web.xml像這樣:

<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映射:

<servlet-mapping> 
    <servlet-name>OAuthServlet</servlet-name> 
    <url-pattern>/oauth/*</url-pattern> 
</servlet-mapping> 

現在,你有一個OAuth的servlet設置(記住,<load-on-startup>是沒有必要的,但我喜歡我的servlet之前,我用它來初始化),讓我們來談談配置JOAuth。

默認的JOAuth配置文件是/WEB-INF/oauth-config.xml(因此它不必在您的servlet聲明中爲<init-param>)。 配置文件如下所示:

<?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> 

<!-- Facebook OAuth --> 
<oauth name="facebook" version="2"> 
    <consumer key="APP_ID" secret="APP_SECRET" /> 
    <provider authorizationUrl="https://graph.facebook.com/oauth/authorize" accessTokenUrl="https://graph.facebook.com/oauth/access_token" /> 
</oauth> 

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

<service path="/oauth_redirect" class="com.neurologic.music4point0.oauth.FacebookOAuthService" oauth="facebook"> 
    <success path="/start.htm" /> 
</service> 
</oauth-config> 

你會發現,每個<oauth>元素有一個version屬性(它是一個的需要控制器知道要使用的OAuth的流動強制屬性)。這些只有有兩個可能的值(OAuth1的1和OAuth2的2)。 對於OAuth 2,<consumer>元素不具有requestTokenUrl屬性,如其版本1對應。

OAuth服務是負責OAuth處理的人員。每個OAuthService由控制器通過​​方法調用。 有2種類型的OAuthService

  • com.neurologic.oauth.service.impl.OAuth1Service
  • com.neurologic.oauth.service.impl.OAuth2Service

注意對於每項服務,如果您正在使用OAuth 2,您必須延伸OAuth2Service的服務。這同樣適用於OAuth 1.如果不這樣做,將導致引發異常。

每個<service>標籤必須name的屬性,比賽<oauth>name屬性(區分大小寫)。

兩個OAuth1ServiceOAuth2Serviceexecute(HttpServletRequest, HttpServletResponse)已落實最好處理OAuth認證協議的流程,但如果你不喜歡它,你可以覆蓋它。

com.neurologic.music4point0.oauth.FacebookOAuthService的例子:

import java.util.Map; 

import javax.servlet.http.HttpServletRequest; 

import net.oauth.enums.GrantType; 
import net.oauth.exception.OAuthException; 
import net.oauth.parameters.OAuth2Parameters; 

import com.neurologic.oauth.service.impl.OAuth2Service; 
import com.neurologic.oauth.util.Globals; 

/** 
* @author The Elite Gentleman 
* @since 05 December 2010 
* 
*/ 
public class FacebookOAuthService extends OAuth2Service { 

private static final String REDIRECT_URL = "http://localhost:8080/Music4Point0/oauth/oauth_redirect"; 

/* (non-Javadoc) 
    * @see com.neurologic.oauth.service.impl.OAuth2Service#processReceivedAuthorization(javax.servlet.http.HttpServletRequest, java.lang.String, java.util.Map) 
    */ 
@Override 
protected String processReceivedAuthorization(HttpServletRequest request, String code, Map<String, String> additionalParameters) throws OAuthException { 
    // TODO Auto-generated method stub 
    OAuth2Parameters parameters = new OAuth2Parameters(); 
    parameters.setCode(code); 
    parameters.setRedirectUri(REDIRECT_URL); 

    Map<String, String> responseMap = getConsumer().requestAcessToken(GrantType.AUTHORIZATION_CODE, parameters, null, (String[])null); 
    if (responseMap == null) { 
    //This usually should never been thrown, but we just do anyway.... 
    throw new OAuthException("No OAuth response retrieved."); 
    } 

    if (responseMap.containsKey("error")) { 
    throwOAuthErrorException(responseMap); 
    } 

    if (responseMap.containsKey(OAuth2Parameters.ACCESS_TOKEN)) { 
    String accessToken = responseMap.remove(OAuth2Parameters.ACCESS_TOKEN); 
    request.getSession().setAttribute(Globals.SESSION_OAUTH2_ACCESS_TOKEN, accessToken); 
    processAdditionalReceivedAccessTokenParameters(request, responseMap); 
    } 

    return null; 
} 

/* (non-Javadoc) 
    * @see com.neurologic.oauth.service.impl.OAuth2Service#processAdditionalReceivedAccessTokenParameters(javax.servlet.http.HttpServletRequest, java.util.Map) 
    */ 
@Override 
protected void processAdditionalReceivedAccessTokenParameters(HttpServletRequest request, Map<String, String> additionalParameters) throws OAuthException { 
    // TODO Auto-generated method stub 

} 
} 

由於Facebook的仍使用OAuth草案2 0(零),他們的訪問令牌不執行HTTP 302重定向,這就是爲什麼processReceivedAuthorization()是返回一個空。 processReceivedAuthorization()方法允許客戶端處理收到的自動化code預計授權URL(這就是爲什麼它期望返回類型String)。 如果該方法返回null或一個空字符串,則不會發生URL重定向。

oauth流程完成後,然後調用<success>元素中的路徑(通過RequestDispatcher),以顯示OAuth已成功完成。

要訪問的訪問令牌,(通過OAuth登錄成功後),請執行下列操作:

AccessToken accessToken = (AccessToken)request.getSession().getAttribute(Globals.SESSION_OAUTH1_ACCESS_TOKEN); //For OAuth 1 access token 
String accessToken = (String)request.getSession().getAttribute(Globals.SESSION_OAUTH2_ACCESS_TOKEN); //For OAuth 2 access token. 

我希望這個小例子可以幫助那些誰是熱衷於將OAuth爲他們的發展經驗歡顏。

對不起,我找不到community wiki複選框。有空的時候訪問我的博客(幾乎沒有任何內容)。

再見:-)

PS這是TwitterOAuthService的實現:

import javax.servlet.http.HttpServletRequest; 

import net.oauth.exception.OAuthException; 
import net.oauth.signature.impl.OAuthHmacSha1Signature; 
import net.oauth.token.AccessToken; 
import net.oauth.token.AuthorizedToken; 
import net.oauth.token.RequestToken; 

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

/** 
* @author The Elite Gentleman 
* @since 05 December 2010 
* 
*/ 
public class TwitterOAuthService extends OAuth1Service { 

    public static final String REQUEST_TOKEN_SESSION = "TWITTER_REQUEST_TOKEN_SESSION"; 

    /* (non-Javadoc) 
    * @see com.neurologic.oauth.service.impl.OAuth1Service#processReceivedAuthorizedToken(javax.servlet.http.HttpServletRequest, net.oauth.token.AuthorizedToken) 
    */ 
    @Override 
    protected AccessToken processReceivedAuthorizedToken(HttpServletRequest request, AuthorizedToken authorizedToken) throws OAuthException { 
     // TODO Auto-generated method stub 
     String requestTokenSecret = null; 
     RequestToken requestToken = (RequestToken) request.getSession().getAttribute(REQUEST_TOKEN_SESSION); 

     if (requestToken != null) { 
      requestTokenSecret = requestToken.getTokenSecret(); 
     } 

     return getConsumer().requestAccessToken(null, authorizedToken, requestTokenSecret, new OAuthHmacSha1Signature()); 
    } 
} 

其他資源