如何解决具有JOAuth的OAuth 1授权,需要示例
| 由于我在LinkedIn / Twitter中看到了有关如何进行OAuth 1 3足或2足授权的问题,因此我想我将发布一个示例,说明如何使用JOAuth向Twitter授权。解决方法
这是从Twitter检索访问令牌
net.oauth.token.v1.AccessToken
的方法。
首先,您需要从Twitter获得两件事,这是将您的应用程序注册到Twitter并获取应用程序所必需的:
API密钥(OAuth称为使用者密钥)
API机密(OAuth称其为消费者机密)。
现在,这是我们向Twitter进行身份验证的方式:
首先,让我们有两个包含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密钥,其次是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
。
HMAC-SHA1,类别OAuthHmacSha1Signature
。
RSA-SHA1,类别OAuthRsaSha1Signature
。
Twitter使用HMAC-SHA1,向其他提供商进行OAuth时请参考文档。
现在我们有了未授权的请求令牌,让我们对其进行授权。
授权(未授权的)请求令牌:
授权要求用户转到服务提供商的URL并登录,因此我们需要一个可在浏览器中重定向到的URL。
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文档。
在基于OOB的呼叫中,一旦授权了应用程序,Twitter就会向您发送PIN:一旦看到该PIN,要获取访问令牌,请执行以下操作:
String twitterPin = \"\"; //Whatever Twitter displayed
AccessToken accessToken = example.requestAccessToken(new AuthorizedToken(requestToken.getToken(),twitterPin),requestToken);
现在我们开始。
调用访问令牌后,实际访问令牌的值就在AccessToken.getToken()
方法上。
回调重定向(非OOB)
如果您未将callback_url
设置为oob
,则在使用授权令牌授权您的应用程序后,Twitter将重定向回您的应用程序。我已经创建了一个处理此问题的流程,因此我们需要22英镑才能为我们完成此任务。
首先,我们需要在项目的WEB-INF
项目下创建一个oauth-config.xml
,如下所示:
<?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>
现在定义一个服务。这项服务将要求我们提供29英镑和9英镑(如果您愿意)。我的完整源代码如下。在调用服务之前,我已经在会话中保存了上面检索到的请求令牌。
/**
*
*/
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处理握手的过程包括授权我的请求令牌和检索访问令牌,而无需编写额外的流代码。
希望对大家有帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。