Yii2のauthclientでTwitterのpost系処理(バグを回避する)

もう少し詳しい内容をQiitaにアップしました。


とつぶやいたら @tanakahisateru さんが↓このヒントを教えてくれたので、
https://twittercommunity.com/t/post-request-returned-message-could-not-authenticate-you-code-32-after-migrated-to-api-v1-1/10264
authclientのソースを追って調べてみました。


結論から言うと、
yii\authclient\clients\Twitter
では今のところ、GET系の処理しか行えません。


POST系の処理を投げると

{"errors":[{"message":"Could not authenticate you","code":32}]}

というエラーレスポンスが返ってきます。


POST系の処理を行うには、親クラスである yii\authclient\OAuth1 の処理を一部書き換える必要があります。

使えるようにしたものを↓に置いておくので、yii\authclient\clients\Twitter の代わりにどうぞ。

<?php
use yii\authclient\OAuth1;

class Twitter extends OAuth1
{
    public $authUrl = 'https://api.twitter.com/oauth/authorize';
    public $requestTokenUrl = 'https://api.twitter.com/oauth/request_token';
    public $requestTokenMethod = 'POST';
    public $accessTokenUrl = 'https://api.twitter.com/oauth/access_token';
    public $accessTokenMethod = 'POST';
    public $apiBaseUrl = 'https://api.twitter.com/1.1';

    protected function initUserAttributes() {
        return $this->api('account/verify_credentials.json', 'GET');
    }
    protected function defaultName() {
        return 'twitter';
    }
    protected function defaultTitle() {
        return 'Twitter';
    }    
    
    protected function composeRequestCurlOptions($method, $url, array $params) {
        if ( $method === 'POST' && strpos($url, $this->apiBaseUrl) === 0 ) {
            $curlOptions = [];
            $curlOptions[CURLOPT_POST] = true;
            if (!empty($params)) {
                $curlOptions[CURLOPT_POSTFIELDS] = http_build_query($params);
            }
            $authorizationHeader = $this->composeAuthorizationHeader($params);
            if (!empty($authorizationHeader)) {
                $curlOptions[CURLOPT_HTTPHEADER] = ['Content-Type: application/x-www-form-urlencoded', $authorizationHeader];
            }
            return $curlOptions;
        } else {
            return parent::composeRequestCurlOptions($method, $url, $params);
        }
    }
}