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

Laravel使用Sanctum时如何通过URL参数的bearer token获取用户信息

基于URL参数的Sanctum用户身份获取实现

核心实现逻辑

你可以直接用Sanctum内置的PersonalAccessToken模型查询对应令牌关联的用户,替换你代码中get user by access token or fail的逻辑即可:

  1. 首先引入令牌模型:
use Laravel\Sanctum\PersonalAccessToken;
  1. 替换用户查询逻辑:
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原生的身份校验逻辑,不用在每个资源控制器里重复写判断:

  1. 生成中间件:
php artisan make:middleware InjectTokenFromQuery
  1. 中间件实现逻辑:
<?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);
    }
}
  1. 注册中间件到app/Http/Kernel.php的路由中间件数组:
protected $routeMiddleware = [
    // 其他中间件
    'inject.token' => \App\Http\Middleware\InjectTokenFromQuery::class,
];
  1. 给私有资源路由加上中间件,直接用auth:sanctum校验身份即可:
Route::get('/private/video', [YourController::class, 'getPrivateVideo'])
    ->middleware(['inject.token', 'auth:sanctum']);

配置后控制器里可以直接调用auth()->user()获取用户,不需要再单独处理tk参数的逻辑。

安全注意事项

  • URL中的令牌会被服务器日志、代理日志、浏览器历史记录留存,不要直接使用用户的长期有效Bearer令牌,建议生成有效期不超过1小时的短期资源专用令牌,或者一次性访问令牌
  • 可以给资源链接增加签名校验,限制链接的有效期,避免令牌泄露后被长期滥用

内容的提问来源于stack exchange,提问作者Inigo EC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:24:03