我在我的PHP应用中使用Hybridauth 3代表我的帐户制作了一些定期推文。 该应用程序具有所有可能的权限我在第一个auth步骤中询问它们时给予它所有权限。 之后,Twitter将我重定向到指定的回调URL,并且我得到了一对access_token和access_token_secret。 但是当我试图使用这些令牌发推文时 - 它给了我:
{"errors":[{"code":220,"message":"Your credentials do not allow access to this resource."}]}
以下是我试图发推文的方式:
$config = [
'authentication_parameters' => [
//Location where to redirect users once they authenticate
'callback' => 'https://mysite/twittercallback/',
//Twitter application credentials
'keys' => [
'key' => 'xxx',
'secret' => 'yyy'
],
'authorize' => true
]
];
$adapter = new Hybridauth\Provider\Twitter($config['authentication_parameters']);
//Attempt to authenticate the user
$adapter->setAccessToken(/*tokens I've got from getAccessToken() on /twittercallback/*/);
if(! $adapter->isConnected()) {
// never goes here, so adapter is connected
return null;
}
try{
$response = $adapter->setUserStatus('Hello world!');
}
catch (\Exception $e) {
// here I've got the error
echo $e->getMessage();
return;
}
尝试重新创建令牌和密钥\密钥对,并多次为应用程序传递auth进程,包括为我的Twitter帐户输入密码(如stackoverflow上的一些帖子所示),但仍然有此错误。
P.S。根据{{3}},Hybridauth已在最近的版本中解决了这个问题。
答案 0 :(得分:0)
看起来您正在使用应用程序身份验证而不是用户身份验证。要发布推文,您必须以用户身份进行身份验证。另外,请确保您的Twitter应用具有读/写权限。
答案 1 :(得分:0)
在比较来自我的服务器的传出请求的标头与required by Twitter之后,我注意到Hybris没有添加标头中非常重要的部分:oauth_token
。至少它不是在Twitter适配器的代码中以及当您使用setAccessToken()
应用访问令牌时的情况。它只是在内部存储中存储令牌,而不是在consumerToken
类中初始化名为OAuth1
的相应类成员。
因此,要正确初始化使用者令牌,我已覆盖apiRequest
类的Twitter
方法(在使用defalut父实现之前)并添加了一个小条件,因此当请求之前消费者令牌为空时 - 我们需要尝试初始化它。
public function apiRequest($url, $method = 'GET', $parameters = [], $headers = [])
{
if(empty($this->consumerToken)) {
$this->initialize();
}
return parent::apiRequest($url, $method, $parameters, $headers);
}
我不确定我是以最好的方式修复它,但只要它正常工作 - 那很好。
答案 2 :(得分:0)
对于您的信息setAccessToken
已在v3.0.0-beta.2中修复(请参阅PR https://github.com/hybridauth/hybridauth/pull/880)
答案 3 :(得分:0)
在实现sample app in clojure时,我遇到了相同的错误,以下资源为解决我对纯应用程序身份验证与用户身份验证的困惑提供了巨大帮助:https://developer.twitter.com/en/docs/basics/authentication/overview/oauth