API-платформа JWT: не найден маршрут для GET / api / login

Я успешно установил платформу API, она хорошо работает со всеми моими сущностями. Теперь я пытаюсь добавить аутентификацию JWT с помощью LexikJWTAuthenticationBundle, но когда я отправляю запрос на вход, я получаю:

Не найден маршрут для "GET / api / login"

Мой запрос :

http://localhost:8000/api/login?username=john&password=doe

Я использую Symfony 4, вот мой security.yaml:

encoders:
    App\Entity\User:
        algorithm: bcrypt

providers:
    entity_provider:
        entity:
            class: App\Entity\User
            property: username

firewalls:
    login:
        pattern:  ^/api/login
        stateless: true
        anonymous: true
        provider: entity_provider
        json_login:
            check_path: /api/login
            username_path: email
            password_path: password
            success_handler: lexik_jwt_authentication.handler.authentication_success
            failure_handler: lexik_jwt_authentication.handler.authentication_failure

    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false

    main:
        pattern:   ^/
        provider: entity_provider
        stateless: true
        anonymous: true
        guard:
            authenticators:
                - lexik_jwt_authentication.jwt_token_authenticator

access_control:
    - { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/api, roles: IS_AUTHENTICATED_FULLY }

Я думаю, что пакет JWT работает хорошо, потому что, когда я пытаюсь получить доступ к ресурсу, я получаю:

{"code":401,"message":"JWT Token not found"}

Я думаю, это просто вопрос маршрутизации, но поскольку я новичок в Symfony, я не знаю, что делать ...

Я уже пробовал менять паттерны, проверять путь ...

Намек?

ИЗМЕНИТЬ: я добавил это в routes.yaml:

api_login_check:
    path: /api/login

Теперь у меня есть :

Не удалось найти контроллер по пути "/ api / login". Маршрут настроен неправильно.

Подробности из журналов:

ПРЕДУПРЕЖДЕНИЕ 09:40:52 запрос Невозможно найти контроллер, так как отсутствует параметр "_controller".

ОШИБКА 09:40:53 request Uncaught PHP Exception Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException: «Невозможно найти контроллер для пути« / api / login ». Маршрут настроен неправильно».


person sylvain    schedule 14.03.2018    source источник
comment
Я застрял с той же проблемой   -  person Castor Duran    schedule 16.03.2018


Ответы (2)


Проверьте эту ссылку https://github.com/symfony/symfony-docs/pull/7081/files#diff-7f5c7908922a550bda01ab86f19f3938R119

Вы должны отправить свой запрос на http://localhost:8000/api/login с телом json. нравится

{"username": "john", "password": "doe"}

Также я рекомендую прочитать «Как создать конечную точку аутентификации JSON» https://symfony.com/doc/current/security/json_login_setup.html.

Спасибо

person lavb    schedule 16.03.2018

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

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

security.yaml

providers:
    entity_provider:
        entity:
            class: App\Entity\User
            property: email
firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false

    login:
        pattern:  ^/api/login
        stateless: true
        anonymous: true
        provider: entity_provider
        json_login:
            check_path: /api/login
            username_path: email
            password_path: password
            success_handler: lexik_jwt_authentication.handler.authentication_success
            failure_handler: lexik_jwt_authentication.handler.authentication_failure

    main:
        pattern:   ^/
        provider: entity_provider
        stateless: true
        anonymous: true
        guard:
            authenticators:
                - lexik_jwt_authentication.jwt_token_authenticator

encoders:
    App\Entity\User:
        algorithm: bcrypt

access_control:
    - { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/api, roles: IS_AUTHENTICATED_FULLY }

routes.yaml

api_login_check:
    path: /api/login

Я попытался войти в свой api с помощью Postman, используя этот URL: http: // localhost: 8000 / api / login

В разделе заголовков у меня есть:

Accept : application/json
Content-type: application/json

И по разделу тела (сырое):

{
    "email":"[email protected]",
    "password":"mypass"
}

Токен успешно сгенерирован и работает, он принимается как носитель в дальнейших вызовах API.

Дополнительная информация: у меня были проблемы с закрытыми и открытыми ключами, сгенерированными с помощью PuttyGen в Windows, у меня всегда были плохие учетные данные при использовании сгенерированного токена. Мне пришлось сгенерировать их в среде Linux с помощью openssl, и теперь он работает. Последняя информация: я установил LexikJWTAuthenticationBundle с помощью composer, я использовал кодовую фразу, сгенерированную в файле .env, для генерации ключей, так как это не очень хорошо объясняется в процессе установки.

person sylvain    schedule 20.03.2018