5

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

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

然后OAuth Javadoc 说

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

正是在这一步中,我遇到了问题。首先,如果我只设置 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
4

1 回答 1

2

我刚刚修改了此页面上关于使用 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 库的文档并非全部。)

于 2013-11-03T17:40:50.617 回答