【问题标题】:OAuth 1 authorization with JOAuth, example needed使用 JOAuth 进行 OAuth 1 授权,需要示例
【发布时间】:2011-06-15 18:14:52
【问题描述】:

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

【问题讨论】:

    标签: java oauth joauth


    【解决方案1】:

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

    首先,您将需要来自 Twitter 的 2 个东西,您需要将您的应用程序注册到 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 Key,接下来是API Secret,OAuth服务提供者(由Request Token URL,Authorize Token URL,Access Token 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 时请参考文档。

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

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

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

    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:一旦您看到该 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,如下所示:

    <?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>
    

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

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

    希望对大家有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 2016-02-04
      • 2013-03-14
      • 2015-12-28
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多