【发布时间】:2021-05-13 06:49:21
【问题描述】:
在从 Symfony 3.4 迁移到 Symfony 5.2 时,我仅在测试中遇到以下问题(在它工作的应用程序中):
- FOSRest
- Symfony 5
- 词汇
fos_rest.yaml
fos_rest:
body_listener:
enabled: true
disable_csrf_role: ROLE_API
format_listener:
rules:
- { path: '^/v1', priorities: [ 'json' ], fallback_format: json, prefer_extension: false }
zone:
- { path: ^/v1/* }
security.yaml
api_login:
pattern: ^/v1/login
stateless: true
anonymous: true
provider: mg_users
json_login:
provider: mg_users
check_path: /v1/login
require_previous_session: false
username_path: email
password_path: password
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
如果我尝试输出响应,针对需要身份验证的 API 端点的功能测试会返回以下输出:
请求
/** @var KernelBrowser $client */
$client = static::createClient();
$client->request(
'POST',
'/v1/login',
[],
[],
[
'CONTENT_TYPE' => 'application/json',
],
'{"email":"admin@email.it","password":"admin"}'
);
回应
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="refresh" content="0;url='https://local.api.it/v1/login'" />
<title>Redirecting to https://local.api.it/v1/login</title>
</head>
<body>
Redirecting to <a href="https://local.api.it/v1/login">https://local.api.it/v1/login</a>.
</body>
</html>
此问题仅出现在需要身份验证的页面/端点中。
如果我使用$client->followRedirect(),则请求不再包含电子邮件和密码,并且我在 HTML 而不是 JSON 中收到 INVALID JSON 错误。
所以问题:
- 如何防止被重定向?
- 为什么它只发生在测试环境中?
- 我如何才能收到 JSON 错误而不是 HTML?
【问题讨论】:
-
您确定您的客户正在请求网址
https://local.api.it/v1/login吗?我的第一个猜测是客户端正在请求 http 并被重定向到 https。 -
FormatListener 可能正在覆盖格式请求。您是否尝试过使用
application/json传递Accept 标头($server 参数中的HTTP_ACCEPT)?您是否在测试环境中启用了探查器? JsonLoginAuthenticator 返回true到support调用?
标签: php api symfony testing fosrestbundle