API-平台 JWT:找不到 "GET /api/login" 的路由

API-Platform JWT : No route found for "GET /api/login"

我成功安装了 API 平台,它适用于我所有的实体。 现在我正在尝试使用 LexikJWTAuthenticationBundle 添加 JWT 身份验证,但是当我发送登录请求时,我得到:

找不到 "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 请求未捕获 PHP 异常 Symfony\Component\HttpKernel\Exception\NotFoundHttpException:"Unable to find the controller for path "/api/login”。路由配置错误。”

检查这个 link https://github.com/symfony/symfony-docs/pull/7081/files#diff-7f5c7908922a550bda01ab86f19f3938R119

您必须使用这样的 json 正文将您的请求发送到 http://localhost:8000/api/login

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

我也推荐阅读这篇文章 "How to Build a JSON Authentication Endpoint" https://symfony.com/doc/current/security/json_login_setup.html

谢谢

谢谢 lvillarino,我已经尝试过了,但没有成功,但我想我当时犯了其他错误...我再次尝试,因为我很确定这是个好方向,现在它起作用了!

这是我的最终配置,也许它会对某人有所帮助... 仅供参考,我使用 email/password 作为凭据。

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

我尝试使用此 url 使用 Postman 登录到我的 api: http://localhost:8000/api/login

在 headers 部分我有:

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

在 body 部分(原始):

{
    "email":"john@doe.fr",
    "password":"mypass"
}

令牌已成功生成并起作用,在进一步的 api 调用中被接受为 Bearer。

更多信息:我在 windows 上使用 PuttyGen 生成的私钥和 public 密钥有问题,我在使用生成的令牌时总是有错误的凭据。我必须使用 openssl 在 linux 环境中生成它们,现在它可以工作了。 最后的信息:我用 composer 安装了 LexikJWTAuthenticationBundle,我使用 .env 文件中生成的密码来生成密钥,因为在安装过程中没有很好地解释它。