Как использовать Oauth2 с помощью cURL и PHP

Я не могу заставить работать сценарий folling:

Я использую api под названием swiftdil. Вот их пример:

Пример запроса:

curl -X POST https://sandbox.swiftdil.com/v1/oauth2/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
-u 'your_username:your_password'

Пример вывода:

{
"access_token":"your_access_token",
"expires_in": 3600,
"refresh_expires_in": 1800,
"refresh_token": "your_refresh_token",
"token_type": "bearer",
"not-before-policy": 0,
"session_state": "your_session_state"
}

Таким образом, URL-адрес, на который я должен отправить свои учетные данные, - https://sandbox.swiftdil.com/v1/oauth2/token

Я пробовал следующий код:

               // Api Credentials
                $url = 'https://sandbox.swiftdil.com/v1/oauth2/token';
                $username = "my_username";
                $password = "my_password";


                // Set up api environment

                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: 
                application/x-www-form-urlencoded'));
                curl_setopt($ch, CURLOPT_HEADER, 1);
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . 
                $password);


                // Give back curl result
                $output = curl_exec($ch);
                $info = curl_getinfo($ch);
                $curl_error = curl_error($ch);
                curl_close($ch);
                print_r($output);
                print_r($info);
                print_r($curl_error);
?>

Скрипт возвращает мне следующий результат:

HTTP/1.1 400 Bad Request Server: nginx/1.13.8 Date: Tue, 15 May 2018 09:17:26 GMT Content-Type: text/html Content-Length: 173 Connection: close

ошибка 400, неверный запрос.

Я что-то пропустил? Я полностью удовлетворяю потребности приведенного выше примера, верно? Я звоню по почте, даю все документы, как просили, но все равно ничего не могу вернуть.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
5 154
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам также необходимо установить поля поста curl, установив опцию ниже в соответствии с вашими данными.

"curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'code' => $code,
'client_id' => $client_id,
'client_secret' => $client_secret,
'redirect_uri' => $redirect_uri,
'grant_type' => 'authorization_code'
))";

If still not work, you can find the curl error as :

if (curl_error($ch))
{
    echo 'error:' . curl_error($ch);
}

Спасибо за ответ. Я только что нашел это в документации API: все запросы API должны выполняться через HTTPS. Любые запросы, сделанные через HTTP, завершатся ошибкой. ЗАПРОС ЗАГОЛОВКИ Требуется авторизация Чтобы запросить токен доступа, отправьте значения client_id и secret в качестве учетных данных базовой аутентификации HTTP. Если вы используете cURL, укажите -u «client_id: секрет». Когда вы вызываете API, отправляйте значение как токен доступа OAuth 2.0 с типом аутентификации, установленным как Bearer. Например: Разрешение: на предъявителя. Как мне реализовать это в коде, который я использую сейчас?

Mand 15.05.2018 12:43
Ответ принят как подходящий

Я не PHP-разработчик, в основном занимаюсь JavaScript. Когда я интегрируюсь с другими службами REST, я обычно использую Postman (https://www.getpostman.com/).

Попробуйте следующее:

  1. Попытка успешно подключиться к API с помощью Postman (должна быть относительно простой).

  2. В случае успеха Postman может автоматически сгенерировать код PHP, который затем можно скопировать и вставить. Работает как шарм с JavaScript, не понимаю, почему с PHP все будет иначе.


Я просто заполнил данные в почтальоне на основе того, что вы предоставили:

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://sandbox.swiftdil.com/v1/oauth2/token",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_HTTPHEADER => array(
    "Authorization: Basic bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ = ",
    "Content-Type: application/x-www-form-urlencoded"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

Пожалуйста, обрати внимание, «Авторизация: базовая» может использоваться как базовый механизм авторизации вместо «носителя» (он тоже должен работать). Поэтому замените 'bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ' строкой в ​​кодировке base64 'имя пользователя: пароль' (используйте фактическое имя пользователя и пароль).

Проголосовали за то, что вы упростили мою жизнь, указав, что Почтальон уже создает этот код, поскольку я уже смоделировал свои звонки в Почтальоне. Итак, 20 секунд спустя я смог проверить с правильными результатами.

Angry 84 10.02.2020 06:01

Другие вопросы по теме