Google OAuth Java客户端和Twitter API

out*_*d3r 5 java twitter oauth google-oauth-java-client

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

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

然后,OAuth Javadoc会说:

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

在此步骤中,我遇到了问题。首先,如果我仅设置OAuthParameters.token值,我将得到一个null异常,因为未设置签名者,所以我现在拥有的是:

    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();
Run Code Online (Sandbox Code Playgroud)

结果始终是:

警告:验证错误:无法应对以下任何挑战:{} com.google.api.client.http.HttpResponseException:401 OK {“错误”:[{“消息”:“无法对您进行身份验证”,“代码“:32}]}

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

我不明白我在做什么。

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

signer.tokenSharedSecret
Run Code Online (Sandbox Code Playgroud)

Bob*_*ous 2

我刚刚修改了此页面上有关使用 google-oauth-java-client向 Twitter 发送请求的代码,当我用以下内容替换相关块后,它工作得很好:

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

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

accessToken.verifier = currentLine;
Run Code Online (Sandbox Code Playgroud)

将 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";
Run Code Online (Sandbox Code Playgroud)

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