我有一台服务器仅使用API端点运行Yii2,另一台服务器具有单页应用程序,该应用程序从Yii服务器获取所有数据。
在应用程序成功登录后,我正在将JWT-Token存储在cookie中,并且我有一个基于此的自定义AuthMethod。
我的问题是使用Cookie进行身份验证时必须使用CSRF保护。 yii应用程序会自动设置一个_csrf
cookie,但目前并没有做很多事情。
据我了解,我需要在登录时向前端应用程序提供此csrf令牌,以便可以将其存储在本地存储中,并为所有后续请求发送标头。
我已经使用Yii::$app->request->csrfTokenFromHeader
实现了对csrf令牌的检查,并在X-CSRF-Token
HTTP标头中发送了令牌。
我无法提取与应用程序内部cookie中存储的值相同的值。 Yii::$app->request->getCsrfToken()
和Yii::$app->request->csrfToken
返回的令牌与存储在_csrf
-cookie中的令牌不同。
这是从我的登录端点发出的:
$token = $model->setCookie(); // Sets the JWT-Token HttpOnly Cookie
$response = [
'message' => 'Login successful',
'csrf-token' => Yii::$app->request->getCsrfToken() // This does not match the _csrf cookie
];
答案 0 :(得分:1)
在阅读了源代码中的更多内容之后,我发现该令牌需要取消屏蔽。这是在Request->validateCsrfTokenInternal()
(用Request->validateCsrfToken()
调用)中完成的。
我在AuthMethod中添加了以下行:
if (!\Yii::$app->request->validateCsrfToken()) throw new HttpException(401, 'Invalid CSRF Token');
这会自动检查X-CSRF-Token
标题。
如果其他人遇到相同的问题,我将离开这个问题。