Cake php результаты аутентификации недействительны только при проверке без сохранения состояния - PullRequest
0 голосов
/ 05 февраля 2020

Используя плагин аутентификации, я не могу подтвердить свои учетные данные через json. Я могу использовать Form, Jwt и Basi c (для тестирования это работает). Возвращенная ошибка: «FAILURE_CREDENTIALS_INVALID». Вот пример кода, "упрощенного для краткости"

public function token()
{

    $result = $this->Authentication->getResult();
    if ($result->isValid()) {
        //new jwt token etc
        $message = true;
        $this->log($result->getStatus());

    }else{
        $message = false;
        $this->log($result->getStatus());

    }

    $this->set([
        'message' => $message,

    ]);

    $this->viewBuilder()->setOption('serialize', ['message']);

}

Мой класс приложения имеет метод

public function getAuthenticationService(ServerRequestInterface $request) : AuthenticationServiceInterface
{

    $service = new AuthenticationService();

    $service->setConfig([
        'unauthenticatedRedirect' => '/users/login',
        'queryParam' => 'redirect',
    ]);


    $fields = [
        'username' => 'email',
        'password' => 'password'
    ];

    // Load the authenticators, you want session first
    $service->loadAuthenticator('Authentication.Session');
    $service->loadAuthenticator('Authentication.Form', [
        'fields' => $fields,
        'loginUrl' => '/users/login'
    ]);

    //Testing jwt
    $service->loadAuthenticator('Authentication.Jwt', [
        'secretKey' => Security::getSalt()]);

    // Load identifiers
    $service->loadIdentifier('Authentication.Password', compact('fields'));
    $service->loadIdentifier('Authentication.JwtSubject');

    return $service;
}

Приложение обслуживает некоторую json хорошо, если я передам jwt, но почему-то я не могу понять, как запросить новый, когда истекает срок действия старого. image with sample json data credentials

Вот мое промежуточное программное обеспечениеQueue:

//some code

    $middlewareQueue

        ->add(new ErrorHandlerMiddleware(Configure::read('Error')))
        ->add(new AssetMiddleware([
            'cacheTime' => Configure::read('Asset.cacheTime'),
        ]))
        ->add(new RoutingMiddleware($this))
        ->add($csrf)
        ->add(new BodyParserMiddleware())
        ->add(new AuthenticationMiddleware($this));

   //more code

Я НЕ использовать основы c

1 Ответ

2 голосов
/ 06 февраля 2020

Как уже упоминалось в комментариях, если вы хотите пройти аутентификацию с использованием средства проверки подлинности формы на конечной точке получения токена, вам необходимо убедиться, что вы включили путь URL-адреса этой конечной точки в параметр аутентификаторов loginUrl.

Этот параметр принимает массив, поэтому он должен быть таким простым:

$service->loadAuthenticator('Authentication.Form', [
    'fields' => $fields,
    'loginUrl' => [
        '/users/login',
        '/api/users/token.json',
    ],
]);

Ошибка, которую вы получили, заключалась в том, что средство проверки подлинности формы просто не было применено к конечной точке токена, и поэтому служба аутентификации go переходит к следующему аутентификатору, аутентификатору JWT, который не привязан к определенной конечной точке c и, следовательно, может работать для всех конечных точек, а аутентификатор JWT, конечно, ожидает другую полезную нагрузку, он выглядит для токена, и если он не может его найти, он вернет статус ошибки FAILURE_CREDENTIALS_INVALID.

...