如何在OAuth身份验证期间静态提供Twitter PIN

时间:2012-08-22 18:52:20

标签: java twitter twitter4j

http://twitter4j.org/en/code-examples.html - 如何在OAuth身份验证期间静态提供Twitter PIN,代码示例讨论如果PIN已经可用,则提供PIN。

我们的应用程序是一个独立的Java应用程序,并且更愿意通过属性文件传递凭据而无需任何人为干预。

2 个答案:

答案 0 :(得分:2)

Twitter将为您提供PIN码。

在这个例子中,Twitter4J假设有人会在网络浏览器中复制它给出的URL(第10行的requestToken.getAuthorizationURL())并通过浏览器授权应用程序。之后,用户应该在示例程序中写入其浏览器中显示的PIN码。

在这个例子中有两个很大的缺点:

  • 人为干预
  • 如果Twitter没有为您提供PIN码,您将为您的示例程序提供哪些代码(如果您的Twitter应用程序的回调网址不是“oob”,则会发生这种情况?)

您必须模拟人工干预以获取PIN码。不幸的是,Twitter4J似乎没有得到这样做的方法(我没有在Javadoc中看到这样的方法)所以你必须自己编写以下过程:

  1. requestToken.getAuthorizationURL()
  2. 检索网页的HTML代码
  3. 此HTML页面包含一个表单,其中一些参数将使用用户名(或电子邮件)和用户密码发布以获取PIN码。这些参数称为“oauth_token”(您已有的临时OAuth令牌),“deny”(如果您不想授权应用程序时使用的标记)和“authenticity_token ”。所有这些都在<input> HTML标记中。选择它们。
  4. 模拟表单的发布。为此,您必须使用POST oauth/authorize端点。网址为https://api.twitter.com/oauth/authorize?oauth_token=<your OAuth Token>。该请求必须在the Twitter process for Authenticating requests之后进行身份验证。这是您要发布的内容:“authenticity_token=<the form's "authenticity_token" parameter>&session[username_or_email]=<user's name or email>&session[password]=<the user's password in clear>”。如果您未授权该应用,请在正文消息中附加“&deny=<the form's "deny" parameter>”。您没有任何问题,因为您在属性文件中获得了凭据(session[xxx]参数),并且您在表单中选择了其他参数(参见2。)。
  5. Twitter API将为您提供一个网页。如果授权成功,则PIN将在内部。但是要小心。 PIN根据回调URL采用不同的名称。如果回调网址为“oob”,则PIN码称为 OAuth PIN 。它是<div id="oauth_pin"> HTML标记中某处的4位数字。否则,它被称为 OAuth Verifier 。它包含在<div class="happy notice callback"> HTML标记中的URL中。在此URL中,PIN是请求字符串的oauth_verifier。它看起来像一个OAuth令牌。
  6. 请不要犹豫,查看我的流程第2步和第4步的网页的HTML代码。理解这个过程非常有用。

答案 1 :(得分:2)

今天我花了一些时间试图找出如何在没有用户干预的情况下使用Twitter4j库进行身份验证。我想出了以下内容:

ConfigurationBuilder conf = new ConfigurationBuilder();
conf.setOAuthConsumerKey(CONSUMER_KEY);
conf.setOAuthConsumerSecret(CONSUMER_KEY_SECRET);
conf.setOAuthAccessToken(TOKEN);
conf.setOAuthAccessTokenSecret(TOKEN_SECRET);
Twitter twitter = new TwitterFactory(conf.build()).getInstance();

通过使用ConfigurationBuilder,我现在可以自动进行身份验证。当然,您需要相应地设置CONSUMER和TOKEN键的值。以下是我验证的方法:

User user = twitter.verifyCredentials();
System.out.println("Successfully verified credentials of " + user.getScreenName());

希望这有帮助!