2

由于我已经看到有关如何在 LinkedIn/Twitter 中进行 OAuth 1 3-legged 或 2-legged 授权的问题,我想我将发布一个示例,说明我如何使用JOAuth向 Twitter 授权。

4

1 回答 1

3

这是net.oauth.token.v1.AccessToken从 Twitter 检索访问令牌的方法。

首先,您将需要来自 Twitter 的 2 个东西,您需要将您的应用程序注册到 Twitter 并获取一个应用程序:

  • API 密钥(OAuth 称为使用者密钥)
  • API 机密(OAuth 将其称为消费者机密)。

现在,我们将通过以下方式向 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服务提供者(由Request Token URL,Authorize Token URL,Access Token URL组成)。

现在,让乐趣开始吧:

请求(未经授权的)请求 Token

要获取请求令牌,我们需要调用requestUnauthorizedTokenfromOAuth1Consumer类:

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

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

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

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

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

现在我们有了一个未经授权的请求令牌,让我们对其进行授权。

授权(未经授权的)请求 Token

授权要求用户访问服务提供商 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_urlas oob,Twitter 将在使用授权 Token 授权您的应用程序后重定向回您的应用程序。我创建了一个处理此问题的流程,因此我们需要我们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>

现在定义一个服务。该服务将要求我们提供 aRequestToken和 a 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 接收到 Access Token 时服务调用的方法(我以 Twitter 为例,但可以随意使用任何服务提供者)。

Servlet 处理从授权我的请求令牌到检索访问令牌的握手,而无需我编写额外的流代码。

我希望这对大家有帮助!

于 2011-06-15T10:05:40.857 回答