由于我在LinkedIn / Twitter上看到过如何进行OAuth 1 3-legged或2-legged授权的问题,我想我会发布一个示例,说明我如何通过{{3 }}
答案 0 :(得分:3)
这是从Twitter检索访问令牌net.oauth.token.v1.AccessToken
的方法。
首先,您将需要Twitter中的两件事,您需要将您的应用程序注册到Twitter并获得应用程序:
现在,我们将如何通过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 Key,接下来是API Secret,OAuth服务提供商(包括请求令牌URL,授权令牌URL,访问令牌URL)。
现在,让乐趣开始吧:
请求(未经授权的)请求令牌:
要获取请求令牌,我们需要从requestUnauthorizedToken
类调用OAuth1Consumer
:
RequestToken requestToken = consumer.requestUnauthorizedToken(null, CALLBACK_URL, null, new OAuthHmacSha1Signature());
第一个参数是realm
,它是null(因为Twitter并没有真正使用它),然后是callback_url
和签名方法。
有3种有效的OAuth签名方法:
OAuthPlainTextSignature
。OAuthHmacSha1Signature
。OAuthRsaSha1Signature
。Twitter使用HMAC-SHA1,在向其他提供商执行OAuth时请参阅文档。
现在我们有一个未经授权的请求令牌,让我们授权它。
授权(未经授权的)请求令牌:
授权要求用户转到服务提供商网址并登录,因此我们需要一个可以在浏览器中重定向到的网址。
String url = consumer.createOAuthUserAuthorizationUrl(requestToken, null);
(第二个参数是null
,因为我们没有要发送的其他HTTP参数,但如果这样做,请创建一个Map<String, String>
属性,填充它们并在方法调用中将其分块: ))
现在我们有了URL,将URL粘贴到浏览器,授权应用程序,callback_url
就在这里:
带外(OOB)授权
OOB授权用于无法执行HTTP重定向但仍希望请求访问令牌的应用程序。 Twitter声明使用PIN代替HTTP重定向。该PIN(在授权Twitter应用程序后显示)由Twitter显示为浏览器上的图像。有关更多信息,请参阅Twitter OAuth API Documentation。
在基于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
为我们执行此操作。
首先,我们需要在项目的oauth-config.xml
项目下创建一个WEB-INF
,如下所示:
<?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>
现在定义一个服务。该服务要求我们提供RequestToken
和realm
(如果您愿意)。我的完整源代码如下。在调用服务之前,我已经在会话中保存了我上面检索到的请求令牌。
/**
*
*/
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通过授权我的请求令牌和检索访问令牌来处理握手,而无需编写额外的流程代码。
我希望这对每个人都有帮助!