我有一个具有以下设置的应用程序:
Laravel
主机:appname.local:8000
环境变量:
角
主机:appname.local:4200
目前有效的方法:
什么不起作用:
对受以下中间件保护的路由的后续请求:auth:sanctum都会导致未经身份验证的响应。HTTP 请求永远不会到达我的控制器。
但是我可以在开发人员的控制台中看到正在发送 cookie。所以我不明白为什么 Sanctum 不接受认证

我已经学习了几个教程,但我似乎无法理解为什么 Laravel 的 Authenticate 中间件无法看到我已经对我的用户进行了身份验证。
有谁知道我可能做错了什么?
我之前使用过 Laravel 的内置 api 令牌身份验证,但我想为不同的客户端提供多个 api 令牌,并且在 Laravel 7.x 中,我正在尝试迁移到 Laravel Sanctum。
API 似乎可以毫无问题地对用户进行身份验证,但是当我尝试使用 获取用户数据时Auth::user();,它返回空值。也 Auth::guard('api')->user();返回null。
我应该使用什么作为 Auth 守卫?还是根据提供的令牌获取用户数据的正确方法?
非常感谢....
当我运行$user->currentAccessToken()->delete();令牌过期时,Auth::check()变成false,它是预期的。
但是,当我走到personal_access_tokens桌子旁时,令牌仍在那里。没有软删除字段。Sanctum 现在令牌过期了怎么办?
在我的api路由文件中,我按照文档(https://laravel.com/docs/8.x/sanctum#introduction)编写了以下代码:
Route::post('/tokens/create', function (Request $request) {
$token = $request->user()->createToken($request->token_name);
return ['token' => $token->plainTextToken];
});
Run Code Online (Sandbox Code Playgroud)
我想设置一个过期延迟,用于将令牌的创建日期与当前检查令牌过期的日期进行比较:令牌的创建日期为x,当前日期为y,并且延迟d会导致令牌过期,如果y > x + d。
所以我读了目录中的一些代码vendor/laravel/sanctum,并且找到了该类Guard.php。
该类Guard.php包含一个名为 的对象属性$expiration、一个设置该属性的构造函数(以及其他内容)以及__invoke包含以下过期检查的方法:
if (! $accessToken ||
($this->expiration &&
$accessToken->created_at->lte(now()->subMinutes($this->expiration))) ||
! $this->hasValidProvider($accessToken->tokenable)) {
return;
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,它正是我想要的。但是,我不知道如何为该属性设置自己的值$expiration。
在同一个文件中,有一些对现有配置文件的暗示,如下所示:config('sanctum.guard', 'web'). 此外,该类SanctumServiceProvider实例化Guard以下值并将其传递给其构造函数:config('sanctum.expiration')。但我不知道如何/在哪里定义这个配置值。也许https://laravel.com/docs/8.x/configuration config(['sanctum.expiration' => '1277126']);?请您确认一下吗?(但是这条线该放在哪里呢?) …
我在 POST 请求正文中将用户的令牌传递给服务器。我需要找出这个令牌属于哪个用户。在 laravel/sanctum 文档中,我发现只有将令牌作为“Authorization”:“Bearer ****”标头才能做到这一点。但这不是我的情况,我需要在 POST 正文中传递它。有办法这样做吗?
因此,我使用 Vue 3、Laravel 8 构建 SPA 并使用 sainttum (hasapitokens) 来处理用户登录,但我找不到令牌有效的会话持续时间,因为我想将其与记住我选项结合使用当用户登录时。这可能吗?或者使用这些令牌是处理用户身份验证的一个坏例子?
我知道将令牌作为 GET 参数传递的危险。我见过这个和这个。但是,就我而言,没有其他方法,因为该路由将由我无法影响的脚本调用。
\n我想我应该实现一个自定义的 Guard 来扩展Illuminate\\Auth\\RequestGuard并重写该public function user()方法。我不明白的是,它$this->callback指向哪里?dd说它是Laravel\\Sanctum\\Guard.. 的一个实例,但是哪个方法呢?
Laravel\\Sanctum\\Guard {#265 \xe2\x96\xbc\n #auth: Illuminate\\Auth\\AuthManager {#267 \xe2\x96\xb6}\n #expiration: null\n #provider: null\n}\nRun Code Online (Sandbox Code Playgroud)\n 我正在尝试让我的网络应用程序的登录流程正常工作。该 Web 应用程序是使用 Nuxt 3 作为在 http://localhost:3000 上运行的前端 (SPA) 和 Laravel 作为在 http://localhost 上运行的后端编写的。
因为 Nuxt 3 使用 fetch API,而 axios 目前不适用于 Nuxt 3,所以我试图让 Laravel Sanctum 的登录流程和 fetch API 正常工作。
我在前端 Nuxt 应用程序上使用可组合函数调用 Laravel 后端,如下所示:
export const useLogin = async (email, password) => {
const config = useRuntimeConfig()
const tokenResponse = await $fetch(config.baseURL + '/sanctum/csrf-cookie', {
method: 'GET',
credentials: 'include'
})
const token = getCookie('XSRF-TOKEN') …Run Code Online (Sandbox Code Playgroud) 我想知道检查用户是否仍然登录客户端的最佳实践是什么。
假设用户登录。如果成功,它将被保存在状态中,如下所示:
axios.post('/login').then(() => {
this.state.loggedInUser = true
});
Run Code Online (Sandbox Code Playgroud)
现在,如果用户刷新浏览器,状态就会丢失,但 和laravel_session仍然XSRF-TOKEN可用且有效。
在每次页面重新加载时添加中间件以发出检索当前登录用户信息的请求是否有意义?像这样的东西?:
const authMiddleware = () => {
axios.get('/user').catch(() => console.error('user is not logged in!'));
};
Run Code Online (Sandbox Code Playgroud)
编辑
请注意,我在 SPA 模式下使用 Sanctum。所以没有代币。
我目前正在尝试使用 Laravel 8.19.0 和 Postman 7.36.1 测试 SPA,但我不断从受“auth:sanctum”保护的路由收到“未经身份验证”的响应,即使我已正确登录。
据我所知,我完全按照https://laravel.com/docs/8.x/sanctum上的文档进行操作 ,以便将 Sanctum 设置为用于 SPA,因此我做了以下操作:
EnsureFrontendRequestsAreStateful::classHttp Kernal 的“ ”。然后,我使用https://blog.codecourse.com/laravel-sanctum-airlock-with-postman/上的指南设置了 Postman,因此我编写了一个脚本来从“ /sanctum/csrf” 获取 CSRF 令牌-cookie ”然后使用所述令牌作为请求标头中“X-XSRF-TOKEN”的值,我可以成功登录。但是,当我随后尝试访问由“auth:sanctum”守卫保护的路由时,即使在请求标头中设置了引用者和“X-XSRF-TOKEN”,我也无法访问该路由。
调试后,我可以看到第 63 行的\vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php中的方法$this->auth->guard($guard)->check()返回 false ,因为Illuminate\Auth\RequestGuard为 nullauthenticate($request, array $guards)$guard = "sanctum"$this->user()。
任何有关要检查的事情的帮助甚至想法都将不胜感激,因为我不确定从这里做什么,缺少花一天时间深入研究请求保护对象及其实例化!
谢谢。