如何在Laravel生产环境后端使用Sanctum令牌访问受保护路由
Laravel Sanctum生产环境令牌使用步骤
1. 确保登录接口返回Sanctum令牌
在登录逻辑(比如LoginController)中,验证用户凭证后生成并返回令牌:
public function login(Request $request) { $credentials = $request->validate([ 'email' => 'required|email', 'password' => 'required' ]); if (!Auth::attempt($credentials)) { return response()->json(['message' => '无效的登录信息'], 401); } $user = Auth::user(); // 生成令牌,plainTextToken是需要传给前端的唯一字符串 $token = $user->createToken('production-auth-token')->plainTextToken; return response()->json([ 'access_token' => $token, 'token_type' => 'Bearer' ]); }
2. 前端存储与携带令牌
- 登录成功后,把返回的
access_token存储在HttpOnly Cookie(生产环境优先,更安全)或localStorage中。 - 每次请求受保护路由时,在请求头中添加令牌:
用Axios可全局配置:Authorization: Bearer {你的令牌字符串}axios.defaults.headers.common['Authorization'] = `Bearer ${localStorage.getItem('access_token')}`;
3. 后端生产环境关键配置
3.1 配置状态域
在.env文件中指定允许访问后端的前端域名(多域名用逗号分隔):
SANCTUM_STATEFUL_DOMAINS=your-frontend-domain.com,www.your-frontend-domain.com # 带端口的场景示例:SANCTUM_STATEFUL_DOMAINS=app.your-domain.com:3000
3.2 配置会话域
在.env中设置SESSION_DOMAIN,确保会话Cookie正常传递:
# 同主域名场景: SESSION_DOMAIN=.your-domain.com # 跨域名场景根据实际情况调整,或留空自动适配
3.3 完善CORS配置
修改config/cors.php,允许前端域名访问并支持Authorization头:
return [ 'paths' => ['api/*', 'sanctum/csrf-cookie'], 'allowed_methods' => ['*'], 'allowed_origins' => ['https://your-frontend-domain.com'], 'allowed_origins_patterns' => [], 'allowed_headers' => ['*'], 'exposed_headers' => [], 'max_age' => 0, 'supports_credentials' => true, // 跨域必须开启 ];
4. 确认路由保护配置
确保受保护路由已正确使用auth:sanctum中间件(从你的截图看已配置,可再次确认):
Route::middleware('auth:sanctum')->group(function () { // 你的受保护路由,示例: Route::get('/user', function (Request $request) { return $request->user(); }); // 其他受保护接口... });
5. 令牌管理(可选)
- 设置过期时间:全局配置在
config/sanctum.php中,或生成令牌时指定:// 生成7天后过期的令牌 $token = $user->createToken('auth-token', ['*'], now()->addDays(7))->plainTextToken; - 撤销令牌:用户登出时清理令牌:
// 撤销指定名称的令牌 $user->tokens()->where('name', 'production-auth-token')->delete(); // 或撤销用户所有令牌 $user->tokens()->delete();
内容的提问来源于stack exchange,提问作者Saad Es
相关产品推荐
相关产品推荐

