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 文件中生成的密码来生成密钥,因为在安装过程中没有很好地解释它。
我成功安装了 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 文件中生成的密码来生成密钥,因为在安装过程中没有很好地解释它。