CakePHP 3 JWT-Auth выдает 401 несанкционированную ошибку - PullRequest
0 голосов
/ 12 сентября 2018

Я использую CakePHP 3.6 и JWT Auth для включения аутентификации на основе токенов в моем приложении, а интерфейс написан на Angular 6.

Мой контроллер входа похож на

<?php
namespace App\Controller\Api;

use Cake\Event\Event;
use Cake\Http\Exception\UnauthorizedException;
use Cake\Utility\Security;
use Crud\Controller\Component\CrudComponent;
use Firebase\JWT\JWT;

class UsersController extends AppController
{
    public function initialize()
    {
        parent::initialize();
        $this->Auth->allow(['add', 'token']);
    }

    public function token()
    {
        $user = $this->Auth->identify();
        if (!$user) {
            throw new UnauthorizedException('Invalid username or password');
        }

        $this->set([
            'success' => true,
            'data' => [
                'token_type' => 'Bearer',
                'expires_in' => 604800,
                'token' => JWT::encode([
                    'sub' => $user['id'],
                    // 'exp' => time() + 604800
                ],
                    Security::getSalt())
            ],
            '_serialize' => ['success', 'data']
        ]);
    }
}

AppController.php содержание

Пространство имен App \ Controller \ Api;

<?php
use Cake\Controller\Controller;

class AppController extends Controller
{
    use \Crud\Controller\ControllerTrait;

    public function initialize()
    {
        parent::initialize();

        $this->loadComponent('RequestHandler');
        $this->loadComponent('Crud.Crud', [
            'actions' => [
                'Crud.Index',
                'Crud.View',
                'Crud.Add',
                'Crud.Edit',
                'Crud.Delete'
            ],
            'listeners' => [
                'Crud.Api',
                'Crud.ApiPagination'
            ]
        ]);

        $this->loadComponent('Auth', [
            'storage' => 'Memory',
            'authenticate' => [
                'Form' => [
                    'fields' => [
                        'username' => 'email',
                        'password' => 'password'
                    ],
                    'finder' => 'auth'
                ],
                'ADmad/JwtAuth.Jwt' => [
                    'parameter' => 'token',
                    'userModel' => 'Users',
                    'finder' => 'auth',
                    'fields' => [
                        'username' => 'id'
                    ],
                    'queryDatasource' => true
                ]
            ],
            'unauthorizedRedirect' => false,
            'checkAuthIn' => 'Controller.initialize'
        ]);
    }

}

При отправке запроса от углового приложения для генерации токена работает нормально и получен следующий ответ.

enter image description here

Но при использовании токена для отправки запроса другим конечным точкам выдается ошибка

401: Unauthorized access

enter image description here

Заголовок запроса / ответа содержит токен

enter image description here

Что я пробовал?

  • Я пытался отключить exp при создании токена доступа.
  • попытался отключить debug в приложении CakePHP.

Отлично работает, когда серверное приложение CakePHP запускается локально.

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

Проверьте код CakePHP, если вы получаете РАЗРЕШЕНИЕ в заголовках.

0 голосов
/ 19 сентября 2018

в вашем .htaccess попробуйте это правило (если активирован mod_rewrite):

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

Со стеком Bitnami LAMP (например, на экземпляре EC2 AWS) модуль php-fdm фильтрует заголовоккаждый запрос, и заголовок «авторизации» облажается.

С помощью этой строки вы можете принудительно создать переменную $ _HTTP с исходным заголовком авторизации.

С уважением

...