具有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处理握手的过程包括授权我的请求令牌和检索访问令牌,而无需编写额外的流代码。 希望对大家有帮助!