Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Twitter4j中多次获取授权URL时出错_Twitter_Twitter Oauth_Twitter4j - Fatal编程技术网

在Twitter4j中多次获取授权URL时出错

在Twitter4j中多次获取授权URL时出错,twitter,twitter-oauth,twitter4j,Twitter,Twitter Oauth,Twitter4j,我正在使用Twitter4j在我的webapp上实现授权工作流(用户访问页面,twitter请求权限,我接收回调并生成oauth访问令牌) 我的第一个问题是,如果我调用一个方法来获取Twitter sigleton: Twitter twitter = TwitterFactory.getSingleton(); twitter.setOAuthConsumer(getClientId(), getClientSecret()); 1) 因为OAuthConsumer已经被定义了,所以我会得到

我正在使用Twitter4j在我的webapp上实现授权工作流(用户访问页面,twitter请求权限,我接收回调并生成oauth访问令牌)

我的第一个问题是,如果我调用一个方法来获取Twitter sigleton:

Twitter twitter = TwitterFactory.getSingleton();
twitter.setOAuthConsumer(getClientId(), getClientSecret());
1) 因为OAuthConsumer已经被定义了,所以我会得到一个异常。我找不到如何询问singleton是否已经定义了凭据。最好的办法是什么?我的解决方案是在一个私人成员中保存单身者

2) 现在我想生成一个AuthorizationURL,所以我需要向Twitter singleton询问OAuthRequestToken:

RequestToken oauthRequestToken = twitter.getOAuthRequestToken(getCallbackURL()); //FIXME
这引发了一个例外:

401:Authentication credentials (https://dev.twitter.com/pages/auth) were missing or incorrect. Ensure that you have set valid consumer key/secret, access token/secret, and the system clock is in sync.
message - Invalid or expired token.
code - 89


Relevant discussions can be found on the Internet at:
 http://www.google.co.jp/search?q=3cc69290 or
 http://www.google.co.jp/search?q=45a986a5
TwitterException{exceptionCode=[3cc69290-45a986a5], statusCode=401, message=Invalid or expired token., code=89, retryAfter=-1, rateLimitStatus=null, version=4.0.4}
 at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:164)
 at twitter4j.HttpClientBase.request(HttpClientBase.java:57)
 at twitter4j.HttpClientBase.post(HttpClientBase.java:86)
 at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:115)
 at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:92)
 at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:292)
 at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:287)
 (...)
注:“相关讨论”链接未按预期工作,我认为

简言之:

1) 如何询问singleton是否已经定义了凭据,以便“setOAuthConsumer”不会抛出错误

2) 如何重新请求singleton生成一个新的authorizationURL供用户访问和授权(再次)

同样发布在相应的

1)我如何询问singleton是否已经定义了凭据,以便“setOAuthConsumer”不会抛出错误? 有几种方法可以做到这一点。您可以在类路径上名为
twitter4j.properties
的属性文件中设置oAuth使用者密钥和密码。当您使用TwitterFactory时,这就是默认属性的来源

如果您想以编程方式设置值,
TwitterFactory
也有一些重载构造函数,允许这样做:

    ConfigurationBuilder builder = new ConfigurationBuilder();
    builder.setOAuthConsumerKey(CONSUMER_KEY);
    builder.setOAuthConsumerSecret(CONSUMER_SECRET);
    Configuration configuration = builder.build();
    TwitterFactory factory = new TwitterFactory(configuration);
    Twitter twitter = factory.getInstance();
2) 如何重新请求singleton生成一个新的authorizationURL供用户访问和授权(再次)? 我假设您的要求是让用户每次都进行授权。如果是这种情况,则通过Twitters API处理。有2个oAuth端点
https://api.twitter.com/oauth/authenticate
https://api.twitter.com/oauth/authorize
authenticate
端点是正常的
登录Twitter
功能,用户将批准一次,然后每次批准后自动登录。
authorize
端点每次都需要授权


使用Twitter4j,可以在
RequestToken
上调用这些单独的方法。您可以根据需要重定向到相应的URL。

我找到的解决方案如下所示:

Twitter instance = new TwitterFactory().getInstance();
instance.setOAuthConsumer(getClientId(), getClientSecret());
RequestToken requestToken = new RequestToken(getOauthToken(),getOauthTokenSecret());
AccessToken oAuthAccessToken = instance.getOAuthAccessToken(requestToken, oauthVerifier);
requestToken
oauthVerifier
在回调中作为参数接收
getOauthToken()
getOauthTokenSecret()
检索库在第一步中检索到并保存在缓存中的令牌(用户->令牌)


受到这个问题/答案的启发:

我想第一项可能是解决我问题的另一个方法,但我还没有测试过。关于第二项:我想我真的需要另一个URL,因为nonce参数和用于防止中间人攻击的签名字段