Yii2のauthclientでTwitterのpost系処理(バグを回避する)
yii2のauthclientでTwitter APIのGET系はいけるんだけどPOST系が動かないでやんす。むきー!
— kamicup/はっしー (@kamicup) 2014, 12月 16
とつぶやいたら @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); } } }