JOAuth,一个基于java的OAuth 1(最终)和OAuth 2(草案10)库。 我该如何使用它?

我在这里看到太多问题(SO)询问OAuth以及如何使用OAuth协议连接到Facebook Graph API或Twitter API。

我发现了JOAuth (来自谷歌代码),我想知道如何使用它? JOAuth提供了哪些其他function,并且与其他java oauth库相比是否能够很好地实现?

看到我写过JOAuth,我认为在SO上回答这个问题是合适的。 我没有找到将此问题作为社区维基的选项。 🙁

注意我不是在这里讨论OAuth授权 。 有各种各样的网站专门为此。

JOAuth有一个很棒的function。 它有一个控制器OAuthServlet ,用于管理来自服务提供商的HTTP重定向响应。 将OAuthServlet配置到Web应用程序的方法,只需在web.xml中将其声明为 ,如下所示:

   An OAuth Servlet Controller OAuthServlet OAuthServlet com.neurologic.oauth.servlet.OAuthServlet  config /WEB-INF/oauth-config.xml  3  

和你的servlet映射:

   OAuthServlet /oauth/*  

现在,你有一个OAuth servlet设置(请记住不是必需的,但我喜欢在我使用之前初始化我的servlet),让我们来谈谈配置JOAuth。

默认的JOAuth配置文件是/WEB-INF/oauth-config.xml (因此它不必是servlet声明中的 )。 配置文件如下所示:

                    

您会注意到每个元素都有一个version属性(它是控制器需要知道要使用哪个oauth流的必需属性)。 这些只有 2个可能的值(OAuth1为1 ,OAuth 2为2)。 对于OAuth 2, 元素不具有与其版本1对应的requestTokenUrl属性。

OAuth服务负责OAuth处理。 控制器通过execute()方法调用每个OAuthServiceOAuthService有两种类型:

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

注意对于每项服务,如果您使用的是OAuth 2,则必须具有扩展 OAuth2Service的服务。 这同样适用于OAuth 1.如果不这样做会导致抛出exception。

每个标记必须具有 name属性匹配name属性(区分大小写)。

OAuth1ServiceOAuth2Service 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 additionalParameters) throws OAuthException { // TODO Auto-generated method stub OAuth2Parameters parameters = new OAuth2Parameters(); parameters.setCode(code); parameters.setRedirectUri(REDIRECT_URL); Map 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 additionalParameters) throws OAuthException { // TODO Auto-generated method stub } } 

由于Facebook仍使用OAuth 2草案0(零),因此其访问令牌不执行HTTP 302重定向,这就是processReceivedAuthorization()返回null的原因。 processReceivedAuthorization()方法允许客户端处理接收到的自动化code期望授权URL(这就是它期望返回类型为String )。 如果方法返回null或空字符串,则永远不会发生url重定向。

oauth流完成后,然后调用元素中的路径(通过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复选框。 如果你有时间,请访问我的博客(几乎没有任何内容)。

Adieu 🙂

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()); } } 

其他资源

  • 使用JOAuth进行OAuth 1授权,需要示例。