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

自从我看到有关如何在LinkedIn / Twitter上进行OAuth 1 3-legged或2-legged授权的问题后,我想我会发布一个例子,说明我如何通过JOAuth授权Twitter。

这是如何从Twitter检索访问令牌net.oauth.token.v1.AccessToken

首先,您将需要Twitter上的两件事,您需要将您的应用程序注册到Twitter并获得一个应用程序:

  • API密钥(OAuth调用消费者密钥)
  • API Secret(OAuth称之为消费者秘密)。

现在,我们将如何通过Twitter进行身份validation:

首先,让我们有两个包含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 Key,接下来是API Secret,OAuth服务提供商(包括请求令牌URL,授权令牌URL,访问令牌URL)。

现在,让乐趣开始吧:

请求(未经授权的)请求令牌

要获取请求令牌,我们需要从OAuth1Consumer类调用requestUnauthorizedToken

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

第一个参数是realm ,它是null(因为Twitter并没有真正使用它),然后是callback_url和一个签名方法。

有3种有效的OAuth签名方法:

  • PLAINTEXT(按原样发送,以纯文本OAuthPlainTextSignature ),类OAuthPlainTextSignature
  • HMAC-SHA1,类OAuthHmacSha1Signature
  • RSA-SHA1,类OAuthRsaSha1Signature

Twitter使用HMAC-SHA1,在向其他提供商进行OAuth时请参考文档。

现在我们有一个未经授权的请求令牌,让我们授权它。

授权(未授权)请求令牌

授权要求用户转到服务提供商url并登录,因此我们需要一个可以在浏览器中重定向到的URL。

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

(第二个参数为null因为我们没有要发送的其他HTTP参数,但如果这样做,请创建一个Map属性,填充它们并在方法调用中将其分块:))

现在我们有了URL,将URL丢失到浏览器,授权应用程序,这里是callback_url来源:

带外(OOB)授权

OOB授权用于无法执行HTTP重定向但仍希望请求访问令牌的应用程序。 Twitter声明使用PIN而不是HTTP重定向。 该PIN(在授权Twitter应用程序后显示)由Twitter显示为浏览器上的图像。 有关更多信息,请参阅Twitter OAuth API文档 。

在基于OOB的呼叫中,一旦您授权应用程序,Twitter就会向您发送PIN:一旦您看到该引脚,要获取访问令牌,请执行以下操作:

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

现在我们开始。

调用访问令牌后,实际访问令牌值将在AccessToken.getToken()方法上。

回调重定向 (非OOB)

如果您没有将callback_url设置为oob ,则在使用授权令牌授权您的应用程序后,Twitter将重定向回您的应用程序。 我创建了一个处理此问题的流程,因此我们需要OAuthServlet为我们执行此操作。

首先,我们需要在项目的WEB-INF项目下创建一个oauth-config.xml ,如下所示:

            

然后我们需要配置我们的web.xml以包含OAuthServlet

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

现在定义一个服务。 该服务将要求我们提供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通过授权我的请求令牌和检索访问令牌来处理握手,而无需编写额外的流代码。

我希望这有助于每个人!