带有 Sanctum CSRF 令牌保护的 Laravel Jetstream 不起作用

时间:2021-03-18 10:04:50

标签: laravel csrf laravel-sanctum jetstream

最近我正在研究如何防止用户个人访问令牌被盗的恶意攻击。这可能发生在那些将访问令牌存储在本地的 SPA 网站/移动应用程序上。比如使用laravel通行证,登录后我们会返回bearer token给我们的用户,那么只要在我们的API头授权中附加了access token,无论你是谁,系统都会被认为是经过认证的。

我发现 Laravel Sanctum 在身份验证过程中提供了某种 CSRF 保护,这似乎可以防止攻击者拦截身份验证过程。但是尝试后我发现它似乎没有按我预期的那样工作。

我使用 VueJs 作为我的前端并在我的本地主机中充当 http://localhost:8080/
因为我的后端托管为 http://api.sanctum.test/

登录系统时,
为了通过 Sanctum CSRF 保护,我们需要按照文档中的说明调用 sanctum/csrf-cookie。 下面是我的 axios 代码

this.axios.get('http://api.sanctum.test/sanctum/csrf-cookie').then(() => {
        this.axios
        .post('http://api.sanctum.test/login', {
          "email": this.email, 
          "password": this.password
        })
        .then(response => (console.log(response.data)));
      });

基本上就是设置csrf cookie,所以在发送/login时,会自动将CSRF-TOKEN附加到header中。如果登录请求成功,系统将返回访问令牌给您,您必须保存纯令牌,否则您无法再次检索它。直到这一步,一切正常。我得到了我的访问令牌,如果将访问令牌附加到其他帖子请求中,它将通过 'auth:sanctum' 中间件和用户已通过身份验证。

但问题是,Sanctrum 的额外保护是什么?例如

Route::group(['middleware' => ['auth:sanctum']], function() {
    Route::post('/user/{id}', function (Request $request, $id) {
        return response()->json(["id" => $id]);
    });
});

在 Postman 中测试时,即使从 header 中删除了 X-XSRF-TOKEN,只要 header 包含访问令牌,请求仍然可以通过中间件。这部分是否与 Laravel 护照个人访问令牌完全相同?我认为在 Sanctum 中每个 POST 请求都必须包含 X-XSRF-TOKEN 以避免 CSRF 攻击,就像 Laravel 在刀片文件中执行的那样?花了很多时间研究官方文档,教程/解释,好像大家只关心如何获取访问令牌,而没有提到下一步。我是不是误解了 Sanctum 的用法?

0 个答案:

没有答案