我正在使用 Laravel sainttum (以前的 Airlock)并且有一个问题。我在文档中读到:
要验证您的 SPA,您的 SPA 登录页面应首先向 /sanctum/csrf-cookie 路由发出请求,以初始化应用程序的 CSRF 保护:
axios.get('/sanctum/csrf-cookie').then(response => {
// Login... });
Run Code Online (Sandbox Code Playgroud)
CSRF 保护初始化后,您应该向典型的 Laravel /login 路由发出 POST 请求。此 /login 路由可能由 laravel/ui 身份验证脚手架包提供。
这是否意味着对于我发出的每个请求,我应该首先检查 cookie 是否已经设置?因为假设我有一个注册的用户。在发出 POST 请求来注册用户之前,我应该首先发出 GET 请求以从后端获取 CSRF-Cookie,然后发出 POST 请求来注册用户。
现在,用户被重定向到登录网页并被要求登录。那么前端是否首先必须检查是否有 CSRF-Cookie,如果没有,是否应该首先再次发出 GET 请求来获取 cookie?
最后一点也让我感到困惑,因为在调用注册方法时,用户实际上并未登录,因此用户必须重定向到登录页面,以使用用户刚刚填写的注册凭据进行登录,这对我来说似乎是这样就像糟糕的用户体验一样,对吧?
我有一个看起来像这样的测试:
$user = factory(User::class)->state('verified')->create();
$this->be($user);
$file = new UploadedFile(storage_path('testing/user.jpg'), 'user.jpg', 'image/jpeg');
$this->post('/account/missing-fields/upload', [
'file' => $file
], ['Content-Type' => 'multipart/form-data'])->dump();
$this->post('/account/missing-fields/upload', [
'file' => $file
], ['Content-Type' => 'multipart/form-data'])->dump();
Run Code Online (Sandbox Code Playgroud)
{#2983
+"token": "hHAY7vD8fOiW8mVU9OIlxVSJv5FzAq52e0coaFHKRC"
+"extension": "jpg"
+"mime": "image/jpeg"
}
{#3072
+"message": "Method Illuminate\Auth\RequestGuard::viaRemember does not exist."
+"exception": "BadMethodCallException"
+"file": "/app/backend/vendor/laravel/framework/src/Illuminate/Support/Traits/Macroable.php"
...
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,第一次请求成功,并返回一个令牌,当我第二次请求时,Laravel 突然说viaRemember方法不存在。
我不知道为什么它不应该工作。
应该注意的是,我可以更改发布请求,第二个请求总是会像上面那样失败。
通过框架,错误发生在Illuminate\Session\Middleware\AuthenticateSession,其中第一个请求有一个web守卫,而第二个请求由于某种原因有web和airlock。
我如何在没有 auth:sanctum 的情况下获取或检查 auth 用户。我尝试auth()->user()从访客路由获取 auth 用户,但我只得到null. 是的,我传递了令牌,但仍然得到空嵌套用户。但是如果我尝试使用里面的路由就可以auth:sanctum了。