【问题标题】:Twitter API responds with "Your credentials do not allow access to this resource" while calling statuses/update.jsonTwitter API 在调用 statuses/update.json 时响应“您的凭据不允许访问此资源”
【发布时间】:2018-03-02 01:17:06
【问题描述】:

我在我的 PHP 应用程序中使用 Hybridauth 3 代表我的帐户发布一些定期推文。 该应用程序具有所有可能的权限。当它在第一个身份验证步骤中要求它们时,我给予它所有权限。 之后 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;
}

尝试重新创建令牌和密钥\秘密对并多次通过应用程序的身份验证过程,包括输入我的 Twitter 帐户的密码(如 stackoverflow 上的一些帖子中所建议的那样),但仍然出现此错误。

附:根据this 的说法,Hybridauth 在最近的版本中已经修复了这个问题。

【问题讨论】:

    标签: php twitter twitter-oauth hybridauth


    【解决方案1】:

    看起来您正在使用应用程序身份验证而不是用户身份验证。为了发布推文,您必须以用户身份进行身份验证。此外,请确保您的 Twitter 应用具有读/写权限。

    【讨论】:

    • 感谢您的快速回复。是什么让您认为我使用的是应用程序身份验证而不是用户身份验证? Hybridauth 只有一种执行 oauth 的身份验证方法 ($adapter->authenticate())。我怀疑他们会使用该方法的默认行为来进行应用程序身份验证,因为他们在示例中的任何地方都使用它来在身份验证过程完成后发布推文。而且,正如我所说,我的应用程序拥有所有可能的权限,我已经在 Twitter 的我的应用程序部分检查了这一点。
    • 如果您在apps.twitter.com 检查了您的应用程序设置并确认它具有读/写权限,那很好。但是,这不是您在原始问题中所说的。您说您“在第一个身份验证步骤要求它们时给予它所有权限。”
    • 我现在看到您可能是由setAccessToken 验证的用户。但是,为了检查,请尝试使用 setUserStatus 以外的其他 API 调用——一个适用于应用程序或用户身份验证的 API。
    【解决方案2】:

    在将来自我的服务器的传出请求的标头与required by Twitter 的标头进行比较后,我注意到 Hybris 没有添加标头中非常重要的部分:oauth_token。至少在 Twitter 适配器的代码和使用setAccessToken() 应用访问令牌的场景中没有这样做。它只是将令牌存储在内部存储中,而不是在 OAuth1 类中初始化名为 consumerToken 的相应类成员。 因此,为了正确初始化消费者令牌,我覆盖了 Twitter 类的 apiRequest 方法(在它使用默认父实现之前)并添加了一个小条件,所以当消费者令牌在请求之前为空时 - 我们需要尝试初始化它。

    public function apiRequest($url, $method = 'GET', $parameters = [], $headers = [])
        {
            if(empty($this->consumerToken)) {
                $this->initialize();
            }
    
            return parent::apiRequest($url, $method, $parameters, $headers);
        }
    

    我不确定我是否已以最佳方式修复它,但只要它正常工作 - 就可以了。

    【讨论】:

      【解决方案3】:

      供您参考,setAccessToken 已在 v3.0.0-beta.2 中修复(请参阅 PR https://github.com/hybridauth/hybridauth/pull/880)

      【讨论】:

      • 谢谢。很高兴看到该项目正在发展。我将在问题描述中添加有关修复的注释。
      【解决方案4】:

      我在实现sample app in clojure 时遇到了同样的错误,以下资源非常有助于解决我对仅应用程序身份验证与用户身份验证的困惑:https://developer.twitter.com/en/docs/basics/authentication/overview/oauth

      【讨论】:

        猜你喜欢
        • 2019-08-17
        • 2016-11-11
        • 2014-06-05
        • 2014-08-19
        • 2014-06-14
        • 2016-01-18
        • 2019-12-04
        • 2014-07-04
        • 2018-02-07
        相关资源
        最近更新 更多