如何使用 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 进行身份验证时返回访问令牌和用户

使用 Laravel 和 Passport 在身份验证失败时响应状态码 401?

Laravel Passport 没有身份验证