symfony - API 平台 - 具有 JWT 身份验证的 Swagger UI

标签 symfony api-platform.com lexikjwtauthbundle

我想在 Swagger 上添加“授权”按钮,如下所述:https://api-platform.com/docs/core/jwt#documenting-the-authentication-mechanism-with-swaggeropen-api

我安装了 LexikJWTAuthenticationBundle,它与 Curl 配合得很好。但是当我浏览到http://localhost:8000/api时,我只看到 {"code":401,"message":"JWT Token not found"}

我错过了什么吗?

这是我的security.yaml:

security:
    encoders:
        App\Entity\User:
            algorithm: bcrypt
    providers:
        db_provider:
            entity:
                class: App\Entity\User
                property: username
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        api_login:
            pattern: ^/api/login
            stateless: true
            anonymous: true
            form_login:
                check_path: /api/login_check
                success_handler: lexik_jwt_authentication.handler.authentication_success
                failure_handler: lexik_jwt_authentication.handler.authentication_failure
                require_previous_session: false
        api:
            pattern: ^/api
            stateless: true
            guard:
                authenticators:
                    - lexik_jwt_authentication.jwt_token_authenticator
        main:
            pattern: ^/
            anonymous: ~
            provider: db_provider
            form_login:
                login_path: app_security_login
                check_path: app_security_login
                csrf_token_generator: security.csrf.token_manager
            logout:
                path: /logout
                target: /
            remember_me:
                secret: '%kernel.secret%'
                lifetime: 604800
                path: /

    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN }
        - { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/api, roles: IS_AUTHENTICATED_FULLY }
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: ROLE_USER }

    role_hierarchy:
        ROLE_ADMIN: ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    access_decision_manager:
        strategy: unanimous

还有我的api_platform.yaml:

api_platform:
    title: 'My project'
    version: '0.0.1'
    mapping:
        paths: ['%kernel.project_dir%/src/Entity']
    swagger:
         api_keys:
             apiKey:
                name: Authorization
                type: header

最佳答案

有点晚了,但我也遇到了同样的问题。您的安全配置表明任何以 /api 开头的路由需要身份验证,其中包括 /api本身。如果您想将文档保留在/api上路由,在安全配置中添加尾部斜杠;

firewalls:
    ...
    api:
        pattern: ^/api/

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

这将留下/api可公开访问,同时需要为 /api/* 提供有效 token .

或者,您可以保留安全配置不变,move the documentation to a different URL (例如 /docs )。为此,您可能需要添加 /docs作为IS_AUTHENTICATED_ANONYMOUSLY access_control下的路径取决于您的其他规则。

然后,当可以访问文档页面时,单击页面顶部的授权按钮并输入 Bearer <valid JWT token> .

关于symfony - API 平台 - 具有 JWT 身份验证的 Swagger UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48880227/

相关文章:

mysql - Symfony Doctrine QB 正在生成过多查询

api-platform.com - API平台-使用子资源添加新实体

php - 如何在 api 平台中通过过滤实现自定义项获取端点?

typescript - Symfony3 JWT 与 LexikJWTAuthenticationBundle 在预检选项上返回 404

php - 在 symfony 中选择 join with doctrine

symfony - 从 Twig 调用 Controller

symfony - 索纳塔异常注册了太多管理员

php - 在 collectionOperations (GET) 上使用 Symfony 选民

php - 具有多个提供商的 LexikJWTAuthenticationBundle