Я пытаюсь получить токен доступа для API Sage One, выполнив документы с помощью пропивать(v6) / Laravel 5.2 (участие Laravel не имеет значения для этого вопроса), оно застряло на этапе «маркера доступа к запросу».
Ошибка
Client error: `POST https://api.sageone.com/oauth2/token` resulted in a
`400 Bad Request` response: {"error":"unsupported_grant_type"}
Оскорбительный код
$client = new Client([
'base_uri'=>'https://api.sageone.com',
'headers' => ['content_type' => 'application/x-www-form-urlencoded']
]);
$data = [
'client_id' => getenv('SAGE_CLIENT'),
'client_secret' => getenv('SAGE_SECRET'),
'code' => $request->code,
'grant_type' => 'authorization_code',
'redirect_uri'=>'https://myurl.com/sage/refresh'
];
$response = $client->request('POST','/oauth2/token',['json' => $data]);
Документы государства «grant_type — тип предоставления, к которому относится код. Authorization_code или refresh_token.», Я пробовал оба. Остальные вары все в порядке, просто grant_type
Похоже, не удается.
ОБНОВЛЕНИЕ 1
Заголовок отладки генерирует вывод ниже.
* Hostname in DNS cache was stale, zapped * Trying 52.49.116.133...
* Connected to api.sageone.com (52.49.116.133) port 443 (#0)
* CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none
* ALPN/NPN, server did not agree to a protocol
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
* subject: CN=api.sageone.com,O=The Sage Group PLC,L=Newcastle Upon Tyne,ST=Newcastle Upon Tyne,C=GB,serialNumber=02231246,businessCategory=Private Organization,incorporationCountry=GB
* start date: May 12 00:00:00 2014 GMT
* expire date: May 11 23:59:59 2016 GMT
* common name: api.sageone.com
* issuer: CN=GeoTrust Extended Validation SSL CA - G2,O=GeoTrust Inc.,C=US > POST /oauth2/token HTTP/1.1 Host: api.sageone.com content_type: application/x-www-form-urlencoded User-Agent: GuzzleHttp/6.1.1 curl/7.43.0 PHP/5.6.18 Content-Type: application/x-www-form-urlencoded Content-Length: 216
* upload completely sent off: 216 out of 216 bytes < HTTP/1.1 400 Bad Request < Content-Type: application/json < Date: Tue, 08 Mar 2016 10:53:09 GMT < Server: openresty < Content-Length: 26 < Connection: keep-alive <
* Connection #0 to host api.sageone.com left intact
Вы отправляете значения в виде данных в кодировке JSON, но вы должны выполнять POST с закодированной формой. Увидеть: http://docs.guzzlephp.org/en/latest/request-options.html#form-params, так
$response = $client->request('POST','/oauth2/token',['form_params' => $data]);
РЕДАКТИРОВАТЬ:
Вы должны проверить свой код еще раз, так как я только что проверил и дважды проверил, что это изменение заставляет его работать в среде реального мудреца. Полный код, который я использовал:
<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client([
'base_uri'=>'https://api.sageone.com',
'headers' => ['content_type' => 'application/x-www-form-urlencoded']
]);
$data = [
'client_id' => getenv('SAGE_CLIENT'),
'client_secret' => getenv('SAGE_SECRET'),
'code' => getenv('SAGE_CODE'),
'grant_type' => 'authorization_code',
'redirect_uri'=>'https://myurl.com/sage/refresh'
];
$response = $client->request('POST','/oauth2/token',['form_params' => $data]);
echo $response->getBody();
?>
Использование json для oAuth действительно некорректно: http://tools.ietf.org/html/rfc6749#section-4.1.3
Я думаю, это неправильно
$response = $client->request('POST','/oauth2/token',['json' => json_encode($data)]);
Вместо этого я бы попробовал что-то вроде этого:
$response = $client->post('/oauth2/token', [], $data);
Или это
$response = $client->post('/oauth2/token', ['body' => $data]);
Другой вопрос, как насчет первого звонка https://www.sageone.com/oauth2/auth
— это прошло?