gpt4 book ai didi

java - 使用 JOAuth 进行 OAuth 1 授权,需要示例

转载 作者:行者123 更新时间:2023-12-04 06:22:51 26 4
gpt4 key购买 nike

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

最佳答案

这是如何检索访问 token net.oauth.token.v1.AccessToken来自推特。

首先,您需要来自 Twitter 的 2 样东西,您需要在 Twitter 上注册您的应用程序并获取应用程序:

  • API key (OAuth 称之为消费者 key )
  • API secret (OAuth 称之为消费者 secret )。

  • 现在,这是我们向 Twitter 进行身份验证的方式:

    首先,让我们拥有包含 API key 和 secret 的 2 个方法:
    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 :

    要获取请求 token ,我们需要调用 requestUnauthorizedToken来自 OAuth1Consumer类(class):
    RequestToken requestToken = consumer.requestUnauthorizedToken(null, CALLBACK_URL, null, new OAuthHmacSha1Signature());

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

    有 3 种有效的 OAuth 签名方法:
  • PLAINTEXT(按原样发送,以明文形式发送),类 OAuthPlainTextSignature .
  • HMAC-SHA1,类 OAuthHmacSha1Signature .
  • RSA-SHA1,类 OAuthRsaSha1Signature .

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

    现在我们有一个未经授权的请求 token ,让我们授权它。

    授权(未授权)请求 token :

    授权要求用户转到服务提供商的 url 并登录,因此我们需要一个可以在浏览器中重定向到的 URL。
    String url = consumer.createOAuthUserAuthorizationUrl(requestToken, null);

    (第二个参数是 null 因为我们没有额外的 HTTP 参数要发送,但如果你这样做了,创建一个 Map<String, String> 属性,填充它们并在方法调用中分块:))

    现在我们有了 URL,将 URL 发送到浏览器,授权应用程序,这里是 callback_url进来:

    带外 (OOB) 授权

    OOB 授权用于无法执行 HTTP 重定向但仍希望请求访问 token 的应用程序。 Twitter 声明使用 PIN 码代替 HTTP 重定向。该 PIN(在授权 Twitter 应用程序后显示)由 Twitter 在浏览器上显示为图像。如需更多信息,请参阅 Twitter OAuth API Documentation .

    在基于 OOB 的调用中,一旦您授权应用程序,Twitter 会向您发送一个 PIN:一旦您看到 PIN,要获取访问 token ,请执行以下操作:
    String twitterPin = ""; //Whatever Twitter displayed
    AccessToken accessToken = example.requestAccessToken(new AuthorizedToken(requestToken.getToken(), twitterPin), requestToken);

    现在我们开始。

    调用访问 token 后,真正的访问 token 值位于 AccessToken.getToken()方法。

    回调重定向 (非OOB)

    如果您没有设置您的 callback_urloob ,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>

    现在定义一个服务。该服务需要我们为它提供 RequestToken和一个 realm (如果你愿意的话)。我的完整源代码如下。在调用服务之前,我已经在 session 中保存了我在上面检索到的请求 token 。
    /**
    *
    */
    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 收到访问 token 时服务调用的方法(我以 Twitter 为例,但可以随意使用任何服务提供者)。

    Servlet 通过授权我的请求 token 和检索访问 token 来处理握手,而无需我编写额外的流程代码。

    我希望这对大家有帮助!

    关于java - 使用 JOAuth 进行 OAuth 1 授权,需要示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6355255/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com