Я пытался понять это, и это кажется общей проблемой, но все остальное, что делают люди, похоже, не работает.
Я использую API Yahoo oAuth (в конечном итоге пытаюсь импортировать контакты), однако, как только я доберусь до шага 4 в этом уроке (https://developer.yahoo.com/oauth/guide/oauth-accesstoken.html) на каком этапе я пытаюсь получить access_token, я получаю сообщение об ошибке, array (1) {[«oauth_problem»] => string (17) «signature_invalid»}
в строке oauth_signature в getAccessToken () я попытался разделить на &,% 26 и% 26& ни один из них не работал. Я попытался использовать HMAC-SHA1 вместо PLAINTEXT, разделяя & но все они дали одинаковые результаты. Я также пробовал urlencode () все, и это не сработало. Когда я var_dump (\ Session :: get (\ Auth :: user () -> id. ‘.oauth_token_secret’)) Я получаю то, что выглядит как настоящий oauth_token_secret, так что я не думаю, что это проблема.
Но в любом случае, вот код (извините метод curl () повсюду)
<?php
namespace App\Models\oAuth2;
class Yahoo {
static public $consumer_key = 'xxx';
static public $consumer_secret = 'xxx';
static public function getContactsLink() {
parse_str(self::curl('https://api.login.yahoo.com/oauth/v2/get_request_token', 'post', NULL, [
'oauth_consumer_key' => self::$consumer_key,
'oauth_signature' => self::$consumer_secret . '&',
'oauth_signature_method' => 'PLAINTEXT',
'oauth_callback' => action('ImportController@yahooContacts'),
'oauth_nonce' => uniqid(rand()),
'oauth_timestamp' => time(),
'oauth_version' => '1.0',
'xoauth_lang_pref' => 'en-us'
]), $response);
\Session::put(\Auth::user()->id . '.oauth_token_secret', $response['oauth_token_secret']);
return $response['xoauth_request_auth_url'];
}
static public function getAccessToken() {
parse_str(self::curl('https://api.login.yahoo.com/oauth/v2/get_token', 'post', NULL, [
'oauth_consumer_key' => self::$consumer_key,
'oauth_signature' => self::$consumer_secret . '%26' . \Session::pull(\Auth::user()->id . '.oauth_token_secret'),
'oauth_signature_method' => 'PLAINTEXT',
'oauth_nonce' => uniqid(rand()),
'oauth_timestamp' => time(),
'oauth_version' => '1.0',
'oauth_verifier' => \Input::get('oauth_verifier'),
'oauth_token' => \Input::get('oauth_token')
]), $response);
dd($response);
}
static function curl($url, $method = 'get', $header = null, $postdata = null, $includeheader=FALSE, $timeout = 60) {
$s = curl_init();
curl_setopt($s,CURLOPT_URL, $url);
if ($header)
curl_setopt($s,CURLOPT_HTTPHEADER, $header);
/*if ($this->debug)*/
curl_setopt($s,CURLOPT_VERBOSE, FALSE);
curl_setopt($s,CURLOPT_TIMEOUT, $timeout);
curl_setopt($s,CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($s,CURLOPT_MAXREDIRS, 3);
curl_setopt($s,CURLOPT_RETURNTRANSFER, true);
curl_setopt($s,CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($s,CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($s,CURLOPT_COOKIEFILE, 'cookie.txt');
if(strtolower($method) == 'post')
{
curl_setopt($s,CURLOPT_POST, true);
curl_setopt($s,CURLOPT_POSTFIELDS, $postdata);
}
else if(strtolower($method) == 'delete')
{
curl_setopt($s,CURLOPT_CUSTOMREQUEST, 'DELETE');
}
else if(strtolower($method) == 'put')
{
curl_setopt($s,CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($s,CURLOPT_POSTFIELDS, $postdata);
}
curl_setopt($s,CURLOPT_HEADER, $includeheader);
//curl_setopt($s,CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1');
curl_setopt($s, CURLOPT_SSL_VERIFYPEER, false);
$html = curl_exec($s);
$status = curl_getinfo($s, CURLINFO_HTTP_CODE);
curl_close($s);
return $html;
}
}
Для кого-то еще с этой проблемой я разобрался в своей проблеме. Вызов get_token должен явно быть GET, а не POST (хотя в документах написано GET & СООБЩЕНИЕ).
Это то, что мой обновленный getAccessToken () Метод выглядит так:
static public function getAccessToken() {
parse_str(self::curl(
'https://api.login.yahoo.com/oauth/v2/get_token?oauth_consumer_key=' . self::$consumer_key .'&oauth_signature=' . self::$consumer_secret . '%26' . \Session::pull(\Auth::user()->id . '.oauth_token_secret') . '&oauth_signature_method=PLAINTEXT&oauth_nonce=' . uniqid(rand()) . '&oauth_timestamp=' . time() . '&oauth_version=1.0&oauth_verifier=' . \Input::get('oauth_verifier') . '&oauth_token=' . \Input::get('oauth_token')
), $response);
dd($response);
}
и это работает отлично.
Других решений пока нет …