我在使用 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);
}
}
使用 ApiPlatform v4,您可以在
config/packages/api_platform.yaml
中执行此操作:
api_platform:
swagger:
api_keys:
my_token_definition:
name: X-Authorization
type: header