php Symfony API平台忽略JWT标记

nuypyhwy  于 2022-12-02  发布在  PHP
关注(0)|答案(2)|浏览(169)

我正在使用jwt(LexikJWTAuthenticationBundle)创建symfony API(API平台)
登录工作得很好。我把这个添加到了安全性中。yaml

login:
        pattern: ^/api/login
        stateless: true
        json_login:
            check_path: /api/login_check
            success_handler: lexik_jwt_authentication.handler.authentication_success
            failure_handler: lexik_jwt_authentication.handler.authentication_failure

服务器将令牌返回给我。但是当我创建安全源时,

- { path: ^/api/notes, roles: IS_AUTHENTICATED_FULLY }

并发送带有令牌的请求,令牌具有类似于

Bearer --token--

服务器忽略它并返回“需要完全身份验证才能访问此资源”。
我怎么能认识到哪里出了问题呢?我花了5个小时和它在一起,但我不知道,我能做些什么。
I使用symfony服务器运行服务器:启动
当我创建测试控制器时

#[Route('/test', name: 'test')]
public function index(Request $request): Response
{
    $auth = $request->headers->get("Authorization");
    return new Response("Authorization: ". "'".$auth."'");
}

它工作,服务器打印我的令牌

Authorization: 'Bearer eyJ0eXAiOiJKV1QiLCJh.....'
5t7ly7z5

5t7ly7z51#

我认为您遗漏了一些配置。您只配置了json_login选项,因此Lexik包现在负责处理您的用户的登录和发布JWT。默认情况下,API平台仍将基于基于会话的cookie来验证请求,而不是通过Authorization头。您必须告诉API平台基于您的JWT来验证请求。
我相信把这个加到你的security.yml中就足够了,但是我还没有检查这个:

firewalls:
    main:
        stateless: true
        provider: app_user_provider <-- this has to point to your user provider
        json_login:
            check_path: /api/login_check
            success_handler: lexik_jwt_authentication.handler.authentication_success
            failure_handler: lexik_jwt_authentication.handler.authentication_failure
        jwt: ~

(drop pattern,将login更改为json_login并添加jwt: ~
请查看此文档:https://api-platform.com/docs/core/jwt/,其中显示了如何使用JWT保护API平台。

j2cgzkjk

j2cgzkjk2#

我有同样的问题API平台由Sylius和第二个GraphQL API /api/v2/graphql(除了Api平台REST API /api/v2)。
在Symfony探查器中,已对graphQL请求禁用安全部分。
graphql端点需要自己的防火墙:
security.yaml为单位

security:
    firewalls:
        graphql_shop_user:
            pattern: "%sylius.security.new_api_route%/graphql"
            provider: sylius_api_shop_user_provider
            stateless: true
            anonymous: true
            guard:
                authenticators:
                    - lexik_jwt_authentication.jwt_token_authenticator

相关问题