如何使用 Laravel Passport 验证令牌?

How to verify a token with Laravel Passport?

我想使用 Laravel Passport 验证令牌。我的 API 的消费者将通过授权 header 将令牌作为 Bearer 令牌传递,我希望 Laravel Passport returns me 如果是有效令牌。

我不想使用中间件,我的 API 将在另一个 Laravel 项目中,但我希望这个项目调用 Laravel Passport 服务器只是为了检查如果令牌有效,我如何检查令牌?

我正在正确发行令牌,只是验证它们,但我不知道如何:(

这是无需中间件即可验证令牌的方法:

Auth::guard('api')->check();

如果您不想在要验证令牌的项目中使用 Passport 中间件,则必须在 Laravel Passport 服务器中创建一个可以接受令牌的端点,执行通常的护照验证和 return 对您的服务的回应。

这将是 Token Introspection 规范的一个实现:https://www.rfc-editor.org/rfc/rfc7662 - 虽然你必须自己实现它,因为我认为 Laravel Passport 不支持它-box.

此外,在验证 JSON Web 令牌(如果这是您使用的令牌类型)时,请记住仅验证签名是不够的。看看这个 best practices article 以了解如何正确使用 JWT。

您可以创建自己的中间件。在该中间件的句柄内,选择 Bearer 令牌并调用您的 Passport 服务器,具体取决于返回的响应如果为真则调用下一个,如果为假则中止。像这样:

public function handle($request, Closure $next)
{
    try {
        $passportEndpoint = 'your_passport_endpoint_here';
        $client = Http::withHeaders([
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => $request->header('Authorization')
        ]);

        $response = $client->get($passportEndpoint);
        if ($response->status() === 200) {
            $body = $response->object();
            //do some stuff with response here, like setting the global logged in user
            

            return $next($request);
        }
    }
    catch (RequestException $exception) {

    }

    return abort(401, 'You are not authenticated to this service');
}