我正在使用Yii2中的REST模块。客户端能够在服务器上进行身份验证,并且还能够获取请求的响应。我已经看到,客户端对系统进行一次身份验证。似乎客户端存储其身份验证信息,因为不需要对后续请求进行进一步的身份验证。
当然,我感兴趣的是每个REST请求都需要身份验证。我已经看到,可能有一种方法可以在应用程序的配置中进行一些固定设置,我希望避免这种情况。
我猜认证信息存储在cookie中。我假设cookie名为'_csrf-frontend'。现在我尝试在控制器功能中删除此cookie。
$cookies = \Yii::$app->response->cookies;
$cookies->remove('_csrf-frontend');
unset($cookies['_csrf-frontend']);
我添加了另外推荐的Idgs答案设置,但仍然没有运气。刷新页面后,必须保留身份验证信息,因为仍然不需要身份验证。
在标题中看一下:
Response Header:
Cache-Control no-store, no-cache, must-revalidate
Connection Keep-Alive
Content-Type application/json; charset=UTF-8
Date Thu, 29 Mar 2018 06:36:37 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive timeout=5, max=100
Pragma no-cache
Server Apache/2.4.18 (Ubuntu)
Set-Cookie _csrf-frontend=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; HttpOnly _identity-frontend=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; HttpOnly
Transfer-Encoding chunked
Request Header:
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language de,en-US;q=0.7,en;q=0.3
Authorization Basic ZG9yaXMua3JhdXNAdmVydHJlbmQuY29tOktyYXVzMTAwMA==
Connection keep-alive
Cookie eafab809c11b0a847c07e9c4f2b93936=uv3f1tof6la24616p7bkf59p55; advanced-frontend=mobbni6v6492kde73amtdvcqi3; _csrf-frontend=4d2ddb54290d2fa7fcc9c4a9900726b795e83aadc658fc0f50395bf7ded0c86aa%3A2%3A%7Bi%3A0%3Bs%3A14%3A%22_csrf-frontend%22%3Bi%3A1%3Bs%3A32%3A%22Oiy_JOiLMg_X0Hz666f0OWpG_r-jcvnO%22%3B%7D
DNT 1
Host localhost
Upgrade-Insecure-Requests 1
User-Agent Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0
只有当我删除Firefox中的所有Browsers Chronik时,才会出现新的身份验证请求。
答案 0 :(得分:0)
可能不是设置登录cookie的CSRF功能,请参阅:rest-authentication docs,它告诉您如何禁用登录会话。
如果您不想使用推荐的配置设置:
'user' => [
'enableSession' => false,
'enableAutoLogin' => false,
您可以在控制器中设置值,如:
public function init()
{
parent::init();
Yii::$app->user->enableSession = false;
Yii::$app->user->loginUrl = null;
}
如果您还想关闭CSRF(例如,如果您的API中有任何Web表单POSTS),请更新您的网站 config 中的request
组件,如:
'components' => [
'request' => [
'enableCsrfValidation' => false,
或要在控制器中关闭CSRF,请使用:
$this->enableCsrfValidation = false;
(显然,如果您将其关闭,您可能希望实施自己的CSRF保护。)