#php #codeigniter #cpanel #guzzle
#php #codeigniter #панель процессора #жрать
Вопрос:
итак, я создал 2 приложения CodeIgniter; одно приложение является API, а другое — клиентским приложением. Я развернул оба приложения в cPanel (перед развертыванием я протестировал оба приложения, и оба они отлично работают). Я протестировал API с помощью Postman, и он работает просто отлично, но когда я пытался получить доступ к API с помощью моего клиентского приложения (используя GuzzleHttp версии 6.5.5), я продолжаю получать ошибку 403 Forbidden.
Контроллер:
public function login()
{
if (isset($this->session->token)) {
$this->session->set_flashdata('danger', 'You are logged in.');
redirect(base_url('main/page_login'));
}
$input = $this->input->post(null, TRUE);
$response = $this->main_model->login($input);
if ($response['status'] != 200) {
$this->session->set_flashdata('danger', $response['message']);
redirect(base_url('main/page_login'));
}
$response['user']['full_name'] = $response['user']['first_name'] . ' ' . $response['user']['last_name'];
$this->session->set_userdata('user', $response['user']);
$this->session->set_userdata('roles', $response['id_roles']);
$this->session->set_userdata('token', $response['token']);
$this->session->set_userdata('is_admin', FALSE);
foreach ($this->session->roles as $roles) {
if (in_array($roles['id_role'], array(1, 2))) {
$this->session->is_admin = TRUE;
}
}
$this->session->set_flashdata('login', 'Logged in');
if ($this->session->flashdata('referrer') != '') {
redirect(base_url($this->session->flashdata('referrer')));
} else {
redirect(base_url('main'));
}
}
Модель:
<?php
//Guzzle configuration
use GuzzleHttpClient;
class Main_model extends CI_Model{
private $_client;
private $_base_uri;
public function __construct()
{
$this->_client = new Client();
$this->_client_service = 'frontend-client';
$this->_auth_key = 'rest-api';
$this->_base_uri = 'https://myapp.com/api';
}
function login($params)
{
$response = $this->_client->request('POST', $this->_base_uri . '/auth/login', [
'headers' => [
'Client-Service' => $this->_client_service,
'Auth-Key' => $this->_auth_key
],
'body' => json_encode($params)
]);
return json_decode($response->getBody()->getContents(), true);
}
?>
Сообщение об ошибке:
An uncaught Exception was encountered
Type: GuzzleHttpExceptionClientException
Message: Client error: `POST https://myapp.com/api/auth/login` resulted in a `403 Forbidden` response: File: /home/u61800/public_html/client/vendor/guzzlehttp/guzzle/src/Middleware.php
Line: 65
Function: create
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 203
Function: GuzzleHttp{closure}
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 156
Function: callHandler
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/TaskQueue.php
Line: 47
Function: GuzzleHttpPromise{closure}
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 246
Function: run
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 223
Function: invokeWaitFn
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 267
Function: waitIfPending
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 225
Function: invokeWaitList
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 62
Function: waitIfPending
File: /home/u61800/public_html/client/vendor/guzzlehttp/guzzle/src/Client.php
Line: 182
Function: wait
File: /home/u61800/public_html/client/application/models/Main_model.php
Line: 31
Function: request
File: /home/u61800/public_html/client/application/controllers/Main.php
Line: 92
Function: login
File: /home/u61800/public_html/client/index.php
Line: 315
Function: require_once
Я пытался использовать User-Agent, Accept и Accept-Encoding в заголовках, но я все еще получаю ошибку 403 Forbidden. Что я сделал неправильно в коде? Заранее спасибо.
Обновление: В ответ на комментарий @Ivan Ivanov; после того, как я изменил ‘body’ на ‘json’, когда я запускаю его вместо 403, система теперь выдает мне внутреннюю ошибку сервера 500. Но опять же, если я попытался войти через postman, это работает просто отлично.
An uncaught Exception was encountered
Type: GuzzleHttpExceptionServerException
Message: Server error: `POST https://myapp.com/api/auth/login` resulted in a `500 Internal Server Error` response:
An uncaught Exception was encountered< (truncated...)
Filename: /home/u61800/public_html/client/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php
Line Number: 113
Backtrace:
File: /home/u61800/public_html/client/vendor/guzzlehttp/guzzle/src/Middleware.php
Line: 65
Function: create
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 203
Function: GuzzleHttp{closure}
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 156
Function: callHandler
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/TaskQueue.php
Line: 47
Function: GuzzleHttpPromise{closure}
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 246
Function: run
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 223
Function: invokeWaitFn
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 267
Function: waitIfPending
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 225
Function: invokeWaitList
File: /home/u61800/public_html/client/vendor/guzzlehttp/promises/src/Promise.php
Line: 62
Function: waitIfPending
File: /home/u61800/public_html/client/vendor/guzzlehttp/guzzle/src/Client.php
Line: 182
Function: wait
File: /home/u61800/public_html/client/application/models/Main_model.php
Line: 31
Function: request
File: /home/u61800/public_html/client/application/controllers/Main.php
Line: 92
Function: login
File: /home/u61800/public_html/client/index.php
Line: 315
Function: require_once
Кроме того, кажется, что $this->_client не равно нулю.
object(GuzzleHttpClient)#21 (1) { ["config":"GuzzleHttpClient":private]=> array(8) { ["handler"]=> object(GuzzleHttpHandlerStack)#22 (3) { ["handler":"GuzzleHttpHandlerStack":private]=> object(Closure)#29 (2) { ["static"]=> array(2) { ["default"]=> object(Closure)#27 (2) { ["static"]=> array(2) { ["default"]=> object(GuzzleHttpHandlerCurlMultiHandler)#23 (6) { ["factory":"GuzzleHttpHandlerCurlMultiHandler":private]=> object(GuzzleHttpHandlerCurlFactory)#24 (2) { ["handles":"GuzzleHttpHandlerCurlFactory":private]=> array(0) { } ["maxHandles":"GuzzleHttpHandlerCurlFactory":private]=> int(50) } ["selectTimeout":"GuzzleHttpHandlerCurlMultiHandler":private]=> int(1) ["active":"GuzzleHttpHandlerCurlMultiHandler":private]=> NULL ["handles":"GuzzleHttpHandlerCurlMultiHandler":private]=> array(0) { } ["delays":"GuzzleHttpHandlerCurlMultiHandler":private]=> array(0) { } ["options":"GuzzleHttpHandlerCurlMultiHandler":private]=> array(0) { } } ["sync"]=> object(GuzzleHttpHandlerCurlHandler)#25 (1) { ["factory":"GuzzleHttpHandlerCurlHandler":private]=> object(GuzzleHttpHandlerCurlFactory)#26 (2) { ["handles":"GuzzleHttpHandlerCurlFactory":private]=> array(0) { } ["maxHandles":"GuzzleHttpHandlerCurlFactory":private]=> int(3) } } } ["parameter"]=> array(2) { ["$request"]=> string(10) "" ["$options"]=> string(10) "" } } ["streaming"]=> object(GuzzleHttpHandlerStreamHandler)#28 (1) { ["lastHeaders":"GuzzleHttpHandlerStreamHandler":private]=> array(0) { } } } ["parameter"]=> array(2) { ["$request"]=> string(10) "" ["$options"]=> string(10) "" } } ["stack":"GuzzleHttpHandlerStack":private]=> array(4) { [0]=> array(2) { [0]=> object(Closure)#30 (1) { ["parameter"]=> array(1) { ["$handler"]=> string(10) "" } } [1]=> string(11) "http_errors" } [1]=> array(2) { [0]=> object(Closure)#31 (1) { ["parameter"]=> array(1) { ["$handler"]=> string(10) "" } } [1]=> string(15) "allow_redirects" } [2]=> array(2) { [0]=> object(Closure)#32 (1) { ["parameter"]=> array(1) { ["$handler"]=> string(10) "" } } [1]=> string(7) "cookies" } [3]=> array(2) { [0]=> object(Closure)#33 (1) { ["parameter"]=> array(1) { ["$handler"]=> string(10) "" } } [1]=> string(12) "prepare_body" } } ["cached":"GuzzleHttpHandlerStack":private]=> NULL } ["allow_redirects"]=> array(5) { ["max"]=> int(5) ["protocols"]=> array(2) { [0]=> string(4) "http" [1]=> string(5) "https" } ["strict"]=> bool(false) ["referer"]=> bool(false) ["track_redirects"]=> bool(false) } ["http_errors"]=> bool(true) ["decode_content"]=> bool(true) ["verify"]=> bool(true) ["cookies"]=> bool(false) ["idn_conversion"]=> bool(true) ["headers"]=> array(1) { ["User-Agent"]=> string(38) "GuzzleHttp/6.5.5 curl/7.62.0 PHP/7.4.8" } } }
Ответ №1:
Вам следует изменить эту строку:
'body' => json_encode($params)
с помощью этого:
'json' => json_encode($params)
Поскольку Guzzle
ожидает 'json' key
в POST array
.
А также var_dump( $this->_client )
чтобы посмотреть, есть ли у вас вообще какой-либо клиент.
Комментарии:
1. Я обновил свой пост относительно вашего комментария, сэр.