Использование PHP cURL для POST-данных на / oauth2 / access_token и GET-данных как jSON

Я выполнил шаг на Path API о том, как аутентифицировать пользователя. В процессе аутентификации учебника пользователь начинает перенаправлять на следующий URL-адрес и запрашивать разрешение на доступ:

https://partner.path.com/oauth2/authenticate?response_type=code&client_id=THE_CLIENT_ID

И после этого сервер выдаст ответ в виде кода авторизации через URL-адрес (я выполнил этот шаг и получил код).

Как объясняется в документации, код следует обменять на токен доступа с использованием / oauth2 / access_token при условии, что идентификатор клиента и секрет клиента (получить access_token)

Но я понятия не имею, как отправлять данные POST через cURL на сервер, я пробовал так много вариантов и комбинаций curl_setopt (), но это все равно ничего мне не дало.

Из Документов запрос выглядит так:

POST /oauth2/access_token HTTP/1.1
Host: partner.path.com
Content-Type: application/x-www-form-urlencoded
Content-Length: <LENGTH>

grant_type=authorization_code&client_id=CLIENT&client_secret=SECRET&code=CODE

И формат cURL такой:

curl -X POST \
     -F 'grant_type=authorization_code' \
     -F 'client_id=CLIENT_ID' \
     -F 'client_secret=CLIENT_SECRET' \
     -F 'code=CODE' \
     https://partner.path.com/oauth2/access_token

И сервер выдаст такой ответ:

HTTP/1.1 201 CREATED
Content-Type: application/json
Content-Length: <LENGTH>

{
    "code": 201,
    "type": "CREATED"
    "reason": "Created",
    "access_token": <ACCESS_TOKEN>,
    "user_id": <USER_ID>,
}

person Jhonny Jr.    schedule 14.07.2015    source источник


Ответы (3)


Чтобы выполнить запрос POST в PHP с помощью cURL, вы можете сделать что-то вроде:

$handle = curl_init('https://partner.path.com/oauth2/access_token');
$data = array('grant_type' => 'authorization_code', 'client_id' => 'CLIENT', 'client_secret' => 'SECRET', 'code' => 'CODE');
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
$resp = curl_exec($handle);

Затем вы можете использовать json_decode($json_encoded), чтобы получить ассоциативный массив из ответа сервера.

person Tris Emmy Wilson    schedule 14.07.2015
comment
Я уже использую этот способ и повторно тестирую снова, но он все еще не работает для меня :( все еще дают мне пустые страницы, хотя я уже использую echo / print_r / var_dump из переменной $ resp - person Jhonny Jr.; 15.07.2015
comment
Это просто не работает, или вы получаете сообщения об ошибках? Вы вообще получаете ответ от сервера? - person Tris Emmy Wilson; 15.07.2015
comment
Нет, я не получаю никакого ответа от сервера, он просто не работает :( но когда я тестирую с помощью Postman, он работает нормально - person Jhonny Jr.; 15.07.2015
comment
вы должны использовать http_build_query($data), иначе content-type не будет установлено в x-www-form-urlencoded - person Hans Z.; 15.07.2015

Не уверен, что вы уже поняли это или нет, так как я вижу, что это было некоторое время назад, но у меня была эта проблема, и вот как я ее понял.

$code = $_GET['code'];
$url = 'https://YourPath/token?response_type=token&client_id='.$client_id.'&client_secret='.$client_secret.'&grant_type=authorization_code&code='.$code.'&redirect_uri='.$redirect_uri;

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST,true);

$exec = curl_exec($ch);
$info = curl_getinfo($ch);
print_r($info);
curl_close($ch);

$json = json_decode($exec);
if (isset($json->refresh_token)){
global $refreshToken;
$refreshToken = $json->refresh_token;
}

$accessToken = $json->access_token;
$token_type = $json->token_type;
print_r($json->access_token);
print_r($json->refresh_token);
print_r($json->token_type);

надеюсь, это поможет

person DennisOakdale    schedule 07.06.2016

дополнение к ответу Фокса Уилсона:

curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
person AlexanderPop    schedule 03.11.2017
comment
Вы должны добавить это как комментарий к предполагаемому ответу @Fox Wilson - person Otieno Rowland; 03.11.2017
comment
Я собирался, но получил У вас должно быть 50 репутации, чтобы комментировать - person AlexanderPop; 05.11.2017