Laravel的auth:api中间件如何从cookie识别token?无法识别问题求解
Laravel 默认的 auth:api 中间件仅会读取请求头 Authorization 中的 Bearer Token,不会主动解析 Cookie 内存储的 Token,可通过以下两种方案解决:
方案1:前置中间件转换请求头(改动最小,推荐)
直接在请求到达 auth:api 中间件前,把 Cookie 中的 Token 转成标准的 Authorization 请求头,无需修改原有鉴权逻辑,auth()->user() 可正常使用。
- 生成中间件
执行命令:php artisan make:middleware AttachBearerTokenFromCookie - 编写中间件逻辑
编辑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); } }
- 注册中间件
编辑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的解析逻辑:
- 注册自定义解析规则
编辑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(); }); }
- 修改API Guard配置
编辑config/auth.php,把apiguard的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
相关产品推荐
相关产品推荐

