我在這裏看到了太多的問題,詢問OAuth以及如何使用OAuth協議連接到Facebook Graph API或Twitter API。JOAuth,一個基於java的OAuth 1(最終)和OAuth 2(草案10)庫。我如何使用它?
我發現了JOAuth(來自Google Code),我想知道我該如何使用它? JOAuth提供了哪些其他功能,並且與其他java oauth庫一樣好?
我在這裏看到了太多的問題,詢問OAuth以及如何使用OAuth協議連接到Facebook Graph API或Twitter API。JOAuth,一個基於java的OAuth 1(最終)和OAuth 2(草案10)庫。我如何使用它?
我發現了JOAuth(來自Google Code),我想知道我該如何使用它? JOAuth提供了哪些其他功能,並且與其他java oauth庫一樣好?
看到我寫了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
屬性(區分大小寫)。
兩個OAuth1Service
和OAuth2Service
execute(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());
}
}
其他資源
請定期檢查是否有新更新(剛更新了圖書館),如果可能,請提供反饋。 – 2011-03-10 12:29:12