【问题标题】:Google OAuth Java client and Twitter APIGoogle OAuth Java 客户端和 Twitter API
【发布时间】:2013-11-07 22:22:51
【问题描述】:

我在使用 Google OAuth Java Client 调用 twitter REST API 时遇到问题。我能够正确完成第一步:

  1. 设置授权网址,
  2. 获取临时令牌,
  3. 生成最终令牌。

然后OAuth Javadoc says

使用存储的访问令牌授权 HTTP 请求到受保护的 通过设置 OAuthParameters.token 并使用 OAuthParameters 作为 HttpRequestInitializer。

在这一步中我遇到了问题。首先,如果我只设置 OAuthParameters.token 值,我会得到一个空异常,因为没有设置签名者,所以我目前拥有的是:

    OAuthHmacSigner signer = new OAuthHmacSigner();
    signer.clientSharedSecret=TWITTER_CONSUMER_SECRET;
    String oauthToken = req.getParameter("oauth_token");
    String oauthVerifier = req.getParameter("oauth_verifier");
    OAuthGetAccessToken accessTokenRequest = new OAuthGetAccessToken(TWITTER_ACESS_TOKEN_URL);
    accessTokenRequest.consumerKey=TWITTER_CONSUMER_KEY;
    accessTokenRequest.signer=signer;
    accessTokenRequest.transport=HTTP_TRANSPORT;
    accessTokenRequest.temporaryToken=oauthToken;
    accessTokenRequest.verifier=oauthVerifier;
    OAuthCredentialsResponse credentials = accessTokenRequest.execute();
    String token = credentials.token;
    OAuthParameters params = new OAuthParameters();
    params.token=token;
    params.version="1.0";
    params.consumerKey=TWITTER_CONSUMER_KEY;
    params.signer=signer;
    HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory(params);
    HttpResponse twResponse = requestFactory.buildGetRequest(new GenericUrl("https://api.twitter.com/1.1/account/verify_credentials.json")).execute();

结果总是:

警告:身份验证错误:无法响应其中任何一个 挑战:{} com.google.api.client.http.HttpResponseException: 401 OK {"errors":[{"message":"Could not authenticate you","code":32}]}

如果我通过 REST Chrome 扩展工具尝试 Twitter OAuth 工具提供的 Authorization 标头,它可以完美运行,因此这不是帐户问题。当我将其更改为由 Google OAuth Java 客户端库计算的 Authorization 标头值时,它不起作用。

我不明白我做错了什么。

解决方案:按照@Arkanon 提供的链接中的教程进行操作,我错过了刷新签名者令牌通过:

signer.tokenSharedSecret

【问题讨论】:

  • 您是否尝试过使用其他任何库?
  • 不,我没有...我打开这个赏金正是为了理解为什么它不能与这个一起工作,这意味着向在 twitter 或其他 oauth1.0 提供商中使用它的人寻求帮助

标签: java twitter oauth google-oauth-java-client


【解决方案1】:

我刚刚修改了this page about using google-oauth-java-client 上的代码以向 Twitter 发送请求,一旦我将相关块替换为以下代码,它就可以正常工作:

while (currentLine.equalsIgnoreCase("n")) {
    System.out.println("Enter the verification PIN provided by Twitter:");
    currentLine = in.readLine();
}

然后将以下内容添加到 accessToken 对象中:

accessToken.verifier = currentLine;

将 Twitter 站点提供的 PIN 输入 Java 控制台并按 Enter 后,该过程完成,可以访问受保护的资源并收到所需的 JSON 响应。

我对该代码所做的唯一其他更改是提供 Twitter 常量,如下所示:

private static final String CONSUMER_KEY =
        "enter-your-consumer-key-here";
private static final String CONSUMER_SECRET =
        "enter-your-consumer-secret-here";
private static final String PROTECTED_SERVICE_URL =
        "https://api.twitter.com/1.1/statuses/home_timeline.json";
private static final String REQUEST_TOKEN_URL =
        "https://api.twitter.com/oauth/request_token";
private static final String AUTHORIZE_URL =
        "https://api.twitter.com/oauth/authenticate";
private static final String ACCESS_TOKEN_URL =
        "https://api.twitter.com/oauth/access_token";

也许这与您希望实现的过程并不完全相同,但希望该页面上的代码可以帮助您发现您可能误解的任何内容。 (我同意 Google 库的文档并非全部。)

【讨论】:

  • 抱歉,您的 PIN 是什么意思?我认为在获得访问令牌后,我不需要做任何其他事情,只需将其与 OAuthParameters 一起使用。就像你写的 url 中代码的第 100 行之后一样。
  • OAuth 机制要求应用程序将用户引导到提供者网站(在本例中为 twitter.com)以访问授权 URL。然后该站点询问用户“您是否要允许 NAME-OF-APP 访问您的数据”。如果用户说是,他们会看到一个新屏幕(在 twitter.com),其中包含他们必须向 Java 应用程序提供的验证 PIN 码,以便允许它收集访问令牌。如果您正在创建一个 Web 应用程序,那么您可以让您的代码简单地将用户的浏览器重定向到 twitter.com,Twitter 可以将它们引导回来,否则需要 PIN。
  • 所以我应该按照你提供的链接做的一切对吗?我的意思是因为它是一个网络应用程序,所以我不需要 PIN 码,对吗?
  • 那么,Twitter 将用户重定向到的 URL(在授权后)应该包含一个查询字符串参数,即验证码,而不是用户手动输入的 PIN。请参阅Twitter page about the process。您需要从 Twitter 提供的查询字符串中提取验证码,然后将其添加到访问令牌对象中。
  • 这正是我正在做的,只是更新了问题。没有 PIN 码你能做到吗?您是否认为可能没有根据提供的令牌正确生成签名
猜你喜欢
  • 2014-05-07
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2014-06-18
  • 2020-01-10
相关资源
最近更新 更多