在尝试更改标头身份验证密钥名称后,我在使用 Swagger UI 进行身份验证时遇到一些问题

问题描述 投票:0回答:1

我在使用 Swagger UI 进行身份验证时遇到一些问题。

我修改了 lexik_jwt_authentication.yaml 文件,从授权标头中提取名为“X-Authorization”而不是“Authentication”的令牌,因为我之前在前端应用程序通过 Caddy 与后端交互时遇到问题。

因此将授权标头密钥更改为“X-Authorization”有助于避免后端和前端身份验证之间的问题。

但现在在 swagger ui 上,我无法使用令牌进行身份验证,因为 Swagger UI 仍然尝试使用“授权”密钥发出 Curl 请求。

我想知道我做错了什么,或者我只是不明白 ApiKeyAuth 的用途 我想做的事情可以实现吗?

我已经阅读了几个论坛和文章,并尝试了以下配置(请参阅下面的nelmio_api_doc.yaml)来更改Swagger UI发出的curl请求,但不幸的是它不接受我尝试进行的更改:

我还尝试使用 eventSubscriber 拦截每个请求,并检查每个请求“kernel.request”的授权密钥。 并修改它。我认为这是要走的路,但它似乎忽略/根本不起作用,所以我放弃了这个想法。 不幸的是,我被卡住了,否则如果我只想检查 swagger ui 上的某些内容,我只需要在“X-Authorization”和“Authorization”之间切换。

Nelmio_api_doc.yaml:

nelmio_api_doc:
    documentation:
        info:
            title: My App
            description: This is an awesome app!
            version: 1.0.0
        components:
            securitySchemes:
                # Bearer:
                #     type: http
                #     scheme: bearer
                ApiKeyAuth:
                    type: apiKey
                    in: header
                    name: X-Authorization
        security:
            - ApiKeyAuth: []
    areas: # to filter documented areas
        path_patterns:
            - ^/api(?!/doc$) # Accepts routes under /api except /api/doc

lexik_jwt_authentication.yaml:

lexik_jwt_authentication:
    secret_key: '%env(resolve:JWT_SECRET_KEY)%'
    public_key: '%env(resolve:JWT_PUBLIC_KEY)%'
    pass_phrase: '%env(JWT_PASSPHRASE)%'
    token_ttl: 36000
    # token_ttl: 3600
    # clock_skew: 0
    # allow_no_expiration: false
    api_platform:
        check_path: /api/login_check
        username_path: email
        password_path: security.credentials.password
    # encoder:
    #     service: acme_api.encoder.nixilla_jwt_encoder
# token extraction settings
    token_extractors:
    #     # look for a token as Authorization Header
        authorization_header:
            enabled: true
            prefix: Bearer
            name:   X-Authorization

Swagger UI Curl(资源)请求:

curl -X 'GET' \
  'https://localhost/api/users?page=1' \
  -H 'accept: application/ld+json' \
  -H 'Authorization: xxxxxx.         <<<<<<<< key is not X-Authorization as specified in nelmio__api_doc.yaml

OpenApiFactory装饰器:

#[AsDecorator('api_platform.openapi.factory')]
class OpenApiFactoryDecorator implements OpenApiFactoryInterface
{
    public function __construct(
        private OpenApiFactoryInterface $decorated,
        // private OpenApiFactory $factory,
    )
    {}

    public function __invoke(array $context = []): OpenApi
    {
        $openApi = $this->decorated->__invoke($context);   

        $components = $openApi->getComponents()->withSecuritySchemes(
            new ArrayObject(
                [
                    'access_token' => new SecurityScheme(
                        type:         'http',
                        description:  'Value for the JWT Authorization header parameter.',
                        scheme:       'bearer'
                    )
                ]
            )
        );

        return $openApi->withComponents($components);
    }
}
symfony swagger openapi swagger-ui
1个回答
0
投票

使用 ApiPlatform v4,您可以在

config/packages/api_platform.yaml
中执行此操作:

api_platform:
    swagger:
        api_keys:
            my_token_definition:
                name: X-Authorization
                type: header
© www.soinside.com 2019 - 2024. All rights reserved.