Laravel使用Sanctum时如何通过URL参数的bearer token获取用户信息
基于URL参数的Sanctum用户身份获取实现
核心实现逻辑
你可以直接用Sanctum内置的PersonalAccessToken模型查询对应令牌关联的用户,替换你代码中get user by access token or fail的逻辑即可:
- 首先引入令牌模型:
use Laravel\Sanctum\PersonalAccessToken;
- 替换用户查询逻辑:
if(auth()->check()){ $user = auth()->user(); } elseif($request->tk) { // 根据参数中的令牌查询记录 $token = PersonalAccessToken::findToken($request->tk); // 验证令牌存在且未过期 if (!$token || ($token->expires_at && $token->expires_at->isPast())) { abort(403); } // 获取关联的用户模型 $user = $token->tokenable; } else { return abort('403'); }
注意你原代码中if(auth()->check(){缺少右括号,需要补上。
更优雅的优化方案
你可以单独写一个中间件,自动把URL参数里的令牌注入到请求头中,后续直接复用Sanctum原生的身份校验逻辑,不用在每个资源控制器里重复写判断:
- 生成中间件:
php artisan make:middleware InjectTokenFromQuery
- 中间件实现逻辑:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class InjectTokenFromQuery { public function handle(Request $request, Closure $next) { // 如果请求带了tk参数,自动组装成标准Bearer授权头 if ($request->has('tk')) { $request->headers->set('Authorization', 'Bearer ' . $request->tk); } return $next($request); } }
- 注册中间件到
app/Http/Kernel.php的路由中间件数组:
protected $routeMiddleware = [ // 其他中间件 'inject.token' => \App\Http\Middleware\InjectTokenFromQuery::class, ];
- 给私有资源路由加上中间件,直接用
auth:sanctum校验身份即可:
Route::get('/private/video', [YourController::class, 'getPrivateVideo']) ->middleware(['inject.token', 'auth:sanctum']);
配置后控制器里可以直接调用auth()->user()获取用户,不需要再单独处理tk参数的逻辑。
安全注意事项
- URL中的令牌会被服务器日志、代理日志、浏览器历史记录留存,不要直接使用用户的长期有效Bearer令牌,建议生成有效期不超过1小时的短期资源专用令牌,或者一次性访问令牌
- 可以给资源链接增加签名校验,限制链接的有效期,避免令牌泄露后被长期滥用
内容的提问来源于stack exchange,提问作者Inigo EC
相关产品推荐
相关产品推荐

