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 關注
- 121 瀏覽
添加回答
舉報