XF 2.1 Curl XenForo 2 API Bad Request

Версия XenForo
2.1.2

Flin007

Проверенные
Сообщения
12
Реакции
5
Баллы
140
Всем привет, у меня был сайт с пользователями и возможностями покупки видео уроков. Решил добавить к нему Форум, базу решил перенести на движок форума. В целом все норм, но главная страница теперь менее функциональная, банально справа в углу нет пользователя и аватарки, начал копаться и наткнулся на API, сижу тестирую.
Получить аватарку и ник авторезированного пользователя смог следующим образом:
PHP:
if (isset($_COOKIE["xf_user"])) {
    $userId = stristr($_COOKIE["xf_user"], ',', true);
    $headers = array(
        'application/x-www-form-urlencoded',
        'XF-Api-Key: API-KEY',
    );
    $url = 'http://localhost/forum/api/users/'.$userId.'/';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $user = json_decode(curl_exec($ch));
    $user_username = $user->user->username;
    $user_avatar = $user->user->avatar_urls->o;
}
Всё сработало вроде, начал копаться дальше, захотел попробовать провести авторизацию с главной страницы

PHP:
$headers = array(
    'Content-type' => 'application/json',
    'XF-Api-Key: API-KEY',
    'login: login',
    'password: password'
);

$url = 'http://localhost/forum/api/auth';
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_exec($ch);

Долго вылетала ошибка "missing": [ "login", "password" ], но если поставить пробел 'login: login' и сделать 'login : login', то начинает вылетать Bad Request, с сообщением:
Your browser sent a request that this server could not understand.

Скорее всего я вообще неправильно всё делаю, но в доках к сожалению нет примеров запросов, а проковыряв все форумы я так и не нашел ответа, поэтому решил спросить сам, да и мб кому то полезное будет потом тоже наткнуться

Подскажите пожалуйста, можно ли использовать таким образом API через curl для получения той же аватарки с ником, и реально ли через curl авторизоваться с внешней страницы?
 
В заголовке не передаются эти данные, а в параметрах. В заголовке ещё пользователь передаётся с ключом.
Т.е добавить
PHP:
// set post fields

$post = [
    'username' => 'user1',
    'password' => 'passuser1',
];

curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
А из заголовка выкинуть эти данные
 
Последнее редактирование:
В заголовке не передаются эти данные, а в параметрах. В заголовке ещё пользователь передаётся с ключом
Извиняюсь за глупый вопрос, просто мой первый опыт с curl в принципе) Нагуглил как установить параметры в curl, работает следующий код, мб кому пригодится:

Код:
$headers = array(
    'Content-type' => 'application/json',
    'XF-Api-Key: API-KEY'
);

$url = 'http://localhost/forum/api/auth';
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'login=admin&password=admin');
$json = json_decode(curl_exec($ch));
var_dump($json);
 
Я дополнил сообщение.
PHP:
// set post fields

$post = [
    'username' => 'user1',
    'password' => 'passuser1',
];

curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
А из заголовка выкинуть эти данные
заменить на 'XF-Api-Key' => 'key'.
Да и кидал рабочий вариант с Guzzle
PHP:
$loader = require_once __DIR__.'/src/vendor/autoload.php';

$client = new \GuzzleHttp\Client();
$res = $client->post('https://yoursite.ru/api/posts', [
    'headers' => [
        'XF-Api-Key' => 'your-key'
    ],
    'form_params' => [
        'your params'
    ]
]);

$request = json_decode($res->getBody(), true);
// 200
echo $res->getStatusCode();
// 'application/json; charset=utf8'
echo $res->getHeaderLine('content-type');
И не благодари....
В заголовке ещё правильней было бы передать
'XF-Api-User' => '1', где 1 это id юзера на которого создан API ключ так будет правильней, о чём я указал выше.
 
Последнее редактирование:
Captain, Спасибо за ответы. Не знаю зачем я пытался сделать аутентификацию через API, т.к. это просто проверка я так понял, залогиниться так не получится)) Вообщем с авторизацией так и не разобрался, вставил просто ссылку на /forum/index.php?login/, после авторизации в принципе перекидывает обратно на страницу главную, так что не такой долгий процесс получается. В принципе тему можно закрыть, проверять через API логин пароль и пользоваться GuzzleHttp меня научили, спасибо) Ниже оставлю код, который я использовал для решения некоторых других проблем, мб кому пригодится.

Помимо авторизации и регистрации на внешней страничке я хотел выводить логин/ник/логотип пользователя если он зашел и предложение войти если он не авторизовался, решил следующим образом:

PHP:
define("ROOT_DIR", $_SERVER['DOCUMENT_ROOT']); //Объявление главной папки
require(ROOT_DIR.'/forum/src/XF.php'); //Подключение XF.php
\XF::start('/hc'); //Запуск XF
$app = \XF::setupApp('XF\Pub\App'); //Запуск приложения
$uid = $app->session()->get('userId'); //Получение id юзера, если он авторизован
$finder = \XF::finder('XF:User'); //Объявленеи файндера

if ($uid) { //Проверка на авторизацию юзера
    $user = $finder->where('user_id', $uid)->fetchOne(); //Получение всех данных юзера
    $userName = $user->username; //Получение ника
    $userAvatar = \XF::app()->templater()->fn('avatar', [$user, 's', true, []]); //Получение аватара
}

/*Дальше в теле сайта где нужно отобразить юзера или предложить войти*/

<?php if ($uid): ?> //Проверка авторизован ли юзер

<a href="/forum/index.php?members/<?=$userName?>.<?=$uid?>/">Профиль</a> //Ссылка на профиль юзера на форуме

<?php echo '<a class="xenword_logout logout" href="' . $app->router()->buildLink( 'canonical:logout', $visitor, array(
                          't' => htmlspecialchars($app->container( 'csrf.token' ) ),
                          'redirect' => $redirect_out
                       ) ) . '">Выход</a>'; ?> //Ссылка на выход из своего аккаунта

<span><a href="/forum/index.php?members/<?=$userName?>.<?=$uid?>/"> <?=$userName?> </a></span> //Вывод ника авторезированного пользователя

<div class="userAvatar">
    <?=$userAvatar?> //Вывод изображения пользователя
</div>

<?php else : ?> //Если ползователь не авторизирован
    
<div class="navbar_user">
    <a href="/forum/index.php?login/" data-open="#auth">Войти</a> //Ссылка на страницу со входом
</div>
    
<?php endif ?>
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу