如何使用 Laravel Passport 验证令牌?
Posted
技术标签:
【中文标题】如何使用 Laravel Passport 验证令牌?【英文标题】:How to verify a token with Laravel Passport? 【发布时间】:2021-06-10 00:28:13 【问题描述】:我想使用 Laravel Passport 验证令牌。我的 API 的使用者将通过 Authorization 标头将令牌作为不记名令牌传递,如果是有效令牌,我希望 Laravel Passport 返回我。
我不想使用中间件,我的 API 将在另一个 Laravel 项目中,但我希望这个项目调用 Laravel Passport 服务器只是为了检查令牌是否有效,我该如何检查令牌?
我是在正确发行令牌,只是在左边验证它们,但我不知道如何:(
【问题讨论】:
【参考方案1】:您可以创建自己的中间件。在该中间件的句柄中,选择 Bearer 令牌并调用您的 Passport 服务器,这取决于返回的响应,如果为 true,则调用 next,如果为 false,则中止。像这样的:
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 服务器上,如何验证令牌在 Laravel Passport 服务器内是否有效? 在 Laravel Passport 服务器中,您可以像往常一样使用具有 API 中间件的端点,并且端点可以返回用户对象或状态码 200。默认情况下,如果令牌错误,则端点将返回未经授权的 401 代码。正如您在我的回答中看到的那样,我正在检查响应代码 200,其他任何内容都会抛出 401。我正在使用来自请求的授权令牌标头调用 Laravel Passport 服务器:'Authorization' => $request->header('授权') 身份验证在 laravel 护照服务器中完成。然后它返回应用程序中使用的令牌。因此,您可以在从其他 laravel 应用程序调用的 laravel 护照服务器中拥有这样的端点: Route::middleware(['auth:api',])->get('auth/user', 'AuthController@getUser ')【参考方案2】:如果您不想在要验证令牌的项目中使用 Passport 中间件,则必须在 Laravel Passport 服务器中创建一个可以接受令牌的端点,执行通常的 Passport 验证并返回对您的服务的回应。
这将是 Token Introspection 规范的实现:https://www.rfc-editor.org/rfc/rfc7662 - 尽管您必须自己实现它,因为我认为 Laravel Passport 不支持它开箱即用。
此外,在验证 JSON Web 令牌(如果这是您使用的令牌类型)时,请记住仅验证签名是不够的。看看这个best practices article,了解如何正确使用 JWT。
【讨论】:
【参考方案3】:这是无需中间件即可验证令牌的方法:
Auth::guard('api')->check();
【讨论】:
这就是我想要的!谢谢!以上是关于如何使用 Laravel Passport 验证令牌?的主要内容,如果未能解决你的问题,请参考以下文章
身份验证用户提供程序 [passport] 未使用 laravel 护照定义
Laravel 5.3 + Passport:总是未经身份验证的错误
使用 Nuxt 前端实现 Laravel 7 Passport 身份验证
使用 Passport 和 Laravel 进行身份验证时返回访问令牌和用户