Google OAuth Java 客户端和 Twitter API

Posted

技术标签:

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

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

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

然后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 提供商中使用它的人寻求帮助 【参考方案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 码你能做到吗?您是否认为可能没有根据提供的令牌正确生成签名

以上是关于Google OAuth Java 客户端和 Twitter API的主要内容,如果未能解决你的问题,请参考以下文章

google drive Oauth 2.0 for java web application

使用 Google Drive Oauth 2.0 管理访问令牌

是否有任何 Node.js 客户端库可以对 Twitter、Facebook、Google、LinkedIn 等进行 OAuth 和 OAuth2 API 调用?

Google OAUTH:请求中的重定向URI与注册的重定向URI不匹配

将 OAuth 2.0 和 Google 电子表格 API 与 Java 结合使用的示例是啥?

Google文档是否已过时?