1 回答
TA贡献1815条经验 获得超6个赞
问题是您只有一个保护身份验证器,并且该身份验证器是 LoginFormAuthenticator,它在AbstractFormLoginAuthenticator.
这个抽象类很方便,但它被认为是用于常规 Web 客户端,而不是用于 API 流。
如果你检查它的start()方法,你会发现:
/**
* Override to control what happens when the user hits a secure page
* but isn't logged in yet.
*
* @return RedirectResponse
*/
public function start(Request $request, AuthenticationException $authException = null)
{
$url = $this->getLoginUrl();
return new RedirectResponse($url);
}
因此,只要经过身份验证的请求命中,它就会得到这个重定向响应。
您的选择是:
便宜又容易:
覆盖start(),LoginFormAuthenticator因此它返回如下内容:
return new JsonReponse(
['status' => 'KO', 'message' => 'Unauthorized'],
Response::HTTP_UNAUTHORIZED]
);
这将返回一个带有 401 的 JSON 和所有未经授权的请求。但是“常规”网络请求不会被重定向到登录表单。这并不理想。
稍微好一些:
检查start()请求是否具有application/*内容类型,并在这些内容上返回 401,但将其余部分重定向到登录表单。
你实际上应该做的事情:
API URL 应该由不同于常规 Web 路径的保护身份验证器保护。为与 API 无关的流量保留登录表单。Api-Platform 包内置了对 JWT 身份验证的支持。只需使用它,它很容易实现。
- 1 回答
- 0 关注
- 89 浏览
添加回答
举报