通过将令牌作为 GET 查询参数传递来通过 Laravel Sanctum 进行身份验证

Gor*_*man 4 php authentication laravel laravel-sanctum

我知道将令牌作为 GET 参数传递的危险。我见过这个这个。但是,就我而言,没有其他方法,因为该路由将由我无法影响的脚本调用。

\n

我想我应该实现一个自定义的 Guard 来扩展Illuminate\\Auth\\RequestGuard并重写该public function user()方法。我不明白的是,它$this->callback指向哪里?dd说它是Laravel\\Sanctum\\Guard.. 的一个实例,但是哪个方法呢?

\n
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

hiz*_*rck 9

我不得不让一些带有 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)

我希望这对某人有用。问候。


Sur*_*raj 5

您可以在 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)