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

Laravel的auth:api中间件如何从cookie识别token?无法识别问题求解

Laravel 5.7 auth:api 中间件识别Cookie中Token的解决方案

Laravel 默认的 auth:api 中间件仅会读取请求头 Authorization 中的 Bearer Token,不会主动解析 Cookie 内存储的 Token,可通过以下两种方案解决:


方案1:前置中间件转换请求头(改动最小,推荐)

直接在请求到达 auth:api 中间件前,把 Cookie 中的 Token 转成标准的 Authorization 请求头,无需修改原有鉴权逻辑,auth()->user() 可正常使用。

  1. 生成中间件
    执行命令:
    php artisan make:middleware AttachBearerTokenFromCookie
  2. 编写中间件逻辑
    编辑 app/Http/Middleware/AttachBearerTokenFromCookie.php:
<?php

namespace App\Http\Middleware;

use Closure;

class AttachBearerTokenFromCookie
{
    public function handle($request, Closure $next)
    {
        // 仅当请求头无Authorization且Cookie存在token时注入
        if ($request->cookie('token') && !$request->headers->has('Authorization')) {
            $request->headers->set('Authorization', 'Bearer ' . $request->cookie('token'));
        }
        return $next($request);
    }
}
  1. 注册中间件
    编辑 app/Http/Kernel.php,把中间件加到 api 中间件组的最前面,确保先于 auth:api 执行:
protected $middlewareGroups = [
    'api' => [
        \App\Http\Middleware\AttachBearerTokenFromCookie::class,
        'throttle:60,1',
        'bindings',
    ],
];

路由不需要修改,保持原有 auth:api 中间件配置即可生效。


方案2:自定义API Guard Token解析逻辑

如果需要更灵活的Token获取规则,可直接扩展API Guard的解析逻辑:

  1. 注册自定义解析规则
    编辑 app/Providers/AuthServiceProvider.php,在 boot 方法中添加如下代码:
public function boot()
{
    $this->registerPolicies();

    Auth::viaRequest('cookie-api-token', function ($request) {
        // 优先取Cookie中的token,其次兼容原有请求头的Bearer token
        $token = $request->cookie('token') ?? $request->bearerToken();
        return \App\User::where('api_token', $token)->first();
    });
}
  1. 修改API Guard配置
    编辑 config/auth.php,把 api guard的driver改为自定义的规则名:
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'cookie-api-token',
        'provider' => 'users',
        'hash' => false,
    ],
],

注意事项

  • Laravel默认所有Cookie都会加密,如果你没有把EncryptCookies中间件加入API中间件组,需要先添加该中间件才能正常读取解密后的Token值。
  • 生产环境请给Cookie设置httponly=true、secure=true(HTTPS环境)、SameSite=Lax属性,避免XSS、CSRF风险。

内容的提问来源于stack exchange,提问作者Rizal Yogi Pratama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 18:54:03