Yii2 REST API中的CSRF令牌以及cookie存储的令牌

时间:2018-08-17 13:09:10

标签: yii2

我有一台服务器仅使用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
];

1 个答案:

答案 0 :(得分:1)

在阅读了源代码中的更多内容之后,我发现该令牌需要取消屏蔽。这是在Request->validateCsrfTokenInternal()(用Request->validateCsrfToken()调用)中完成的。

我在AuthMethod中添加了以下行:

if (!\Yii::$app->request->validateCsrfToken()) throw new HttpException(401, 'Invalid CSRF Token');

这会自动检查X-CSRF-Token标题。

如果其他人遇到相同的问题,我将离开这个问题。