Laravel中的Sanctum和Vue之间是怎么通过TOKEN来产生会话的?

环境是PHP8.2.9+Laravel10

我这边打算用Laravel10+Vue3前后端隔离,通过Json互通数据。

Laravel10的话我用sanctum来判断用户是否登录,但是我不了解这个API验证是一个怎么样的一个过程,用户登录了生成一个TOKEN,这个token保存在哪里?后续的要获取相关信息的话,怎么通过token来判断是否登录呢????

整个流程我都不太明白,有哪位大哥可以解释解释吗?

我这边已经弄好sanctum插件了,也生成好相关的表了,就是不太懂整个流程是怎么样的?

阅读 523
avatarAI BotBETA

Sanctum API Token 认证流程详解(Laravel+Vue 前后端分离场景):

  1. Token生成阶段

    // 登录控制器
    public function login(Request $request)
    {
     $credentials = $request->validate([
         'email' => 'required|email',
         'password' => 'required'
     ]);
    
     if (!Auth::attempt($credentials)) {
         return response()->json(['message' => 'Invalid credentials'], 401);
     }
    
     // 生成API Token(返回普通token)
     $token = $request->user()->createToken('vue3-token')->plainTextToken;
     
     return response()->json([
         'token' => $token,
         'user' => Auth::user()
     ]);
    }
  2. Token存储位置:personal_access_tokens 表(sanctum生成)
  3. 前端存储:Vue收到token后应存储在localStoragesessionStorage
  4. 请求携带Token

    // Vue3请求示例(axios)
    axios.get('/api/user', {
     headers: {
         Authorization: `Bearer ${localStorage.getItem('token')}`
     }
    })
  5. Laravel验证流程

    // 路由保护(routes/api.php)
    Route::middleware('auth:sanctum')->group(function () {
     Route::get('/user', function (Request $request) {
         return $request->user();
     });
    });
  6. 验证过程:

    1. Sanctum中间件检查Authorization头
    2. 解析Bearer Token
    3. 验证token有效性(是否存在于personal_access_tokens表)
    4. 关联用户模型
    5. 通过$request->user()获取认证用户
  7. 关键配置项

    SESSION_DRIVER=cookie
    SANCTUM_STATEFUL_DOMAINS=your-frontend-domain.com
  8. 注销处理

    // 注销控制器
    public function logout(Request $request)
    {
     $request->user()->currentAccessToken()->delete();
     return response()->json(['message' => 'Logged out']);
    }

补充说明:

  • 跨域配置需正确设置(config/cors.php)
  • 生产环境建议使用HTTPS
  • Token有效期默认永久,可通过中间件自定义过期策略
  • 前端应实现token自动续期/刷新逻辑
  • 敏感接口建议配合CSRF保护(当使用浏览器cookie时)
1 个回答

默认情况下, Token 需要通过 Request Header,进行传递,根据不同的请求包自行传就好了。

Authorization: Bearer <TOKEN>

这个 Token 是有状态的,在 personal_access_tokens 表中存放,也提供的有相关的 API 来管理 Token。

对于需要用户登录后可见的接口或页面,使用 auth:sanctum 中间件进行保护就好了,或者把 sanctum 设置为默认的 guard。

大致流程官网的 文档 上已经提到了的。

用户名、密码通过验证后,生成 Token 返回给前端,然后前端保存这个 Token,后续请求再带上就好了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏