如何使用 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');
}
我想使用 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');
}