我有一台运行Yii2的服务器,其中只有一个API端点,另一台服务器有一个单页面应用程序,可以从Yii服务器获取所有数据。
当应用程序成功登录时,我将JWT-Token存储在cookie中,并且我有一个基于此的自定义AuthMethod。
我的问题是,当cookies用于身份验证时,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
];
发布于 2018-08-17 21:31:10
在阅读了更多的源代码后,我发现这个令牌需要取消屏蔽。这是在用Request->validateCsrfToken()
调用的Request->validateCsrfTokenInternal()
中完成的。
我将以下行添加到我的AuthMethod中:
if (!\Yii::$app->request->validateCsrfToken()) throw new HttpException(401, 'Invalid CSRF Token');
这会自动检查X-CSRF-Token
-header。
我留下这个问题,以防其他人也有同样的问题。
https://stackoverflow.com/questions/51896159
复制相似问题