You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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中。
  • 每次请求受保护路由时,在请求头中添加令牌:
    Authorization: Bearer {你的令牌字符串}
    
    用Axios可全局配置:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:55:44