Gor*_*man 4 php authentication laravel laravel-sanctum
我知道将令牌作为 GET 参数传递的危险。我见过这个和这个。但是,就我而言,没有其他方法,因为该路由将由我无法影响的脚本调用。
\n我想我应该实现一个自定义的 Guard 来扩展Illuminate\\Auth\\RequestGuard
并重写该public function user()
方法。我不明白的是,它$this->callback
指向哪里?dd
说它是Laravel\\Sanctum\\Guard
.. 的一个实例,但是哪个方法呢?
Laravel\\Sanctum\\Guard {#265 \xe2\x96\xbc\n #auth: Illuminate\\Auth\\AuthManager {#267 \xe2\x96\xb6}\n #expiration: null\n #provider: null\n}\n
Run Code Online (Sandbox Code Playgroud)\n
我不得不让一些带有 TOKEN URL 的请求返回 pdf 内容。因此,我创建了中间件来验证令牌是否存在,然后将其添加到标头响应中,这样我就利用了“正常”圣所令牌验证。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Log;
/**
* This middleware check if the request has _token key and adds this into the Authorization header to take advantage of
* the sanctum middleware
*/
class CheckTokenAndAddToHeaderMiddleware
{
/**
* Handle an incoming request.
*
* @param Request $request
* @param Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return Response|RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
$all = $request->all();
if (isset($all['_token'])) {
Log::debug('token from http param', [$all['_token']]);
$request->headers->set('Authorization', sprintf('%s %s', 'Bearer', $all['_token']));
}
return $next($request);
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于我的要求,我决定将此中间件放在所有 URL 上,因此我在所有 API 调用之前添加了它(对您来说可能会有所不同)。
内核.php
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'api' => [
CheckTokenAndAddToHeaderMiddleware::class,
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class
],
];
Run Code Online (Sandbox Code Playgroud)
我希望这对某人有用。问候。
您可以在 AppServiceProvider 启动方法中添加以下代码,以使用令牌作为查询参数进行身份验证。Laravel sainttum 接受覆盖默认值的可调用函数。您可以按照适合您的应用程序的方式修改代码。
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Sanctum::getAccessTokenFromRequestUsing(
function ($request) {
return $request->token;
}
);
}
Run Code Online (Sandbox Code Playgroud)