使用Laravel护照获取经过身份验证的用户并授予密码

2022-08-30 18:54:31

我用Laravel做了一个API REST,现在我正在尝试使用它。问题是我需要在API中对用户进行身份验证,并且我正在使用密码授予方法。我可以正确对用户进行身份验证,并且可以获取访问令牌,但从那时起,我看不到使用使用访问令牌检索经过身份验证的用户的方法。

我在API中尝试了这样的路由:

Route::get('/user', function(Request $request) {
    $user = $request->user();
    // Even with
    $user = Auth::user();

    return $user;
});

没有骰子。我正在阅读护照代码,但我无法弄清楚。我的猜测是,我需要指定一种新的警卫类型或其他东西,因为Laravel Passport似乎没有为这种赠款类型提供一种......

为了澄清事情:

  • 我有一个API REST应用程序,它是oAuth2 Server。
  • 我有另一个应用程序使用API REST。
  • 我知道工作流程。在我的情况下,使用密码授予,我在我的消费者应用程序中获取用户凭据,然后我向/oauth/token发出请求,指定grant_type密码,我提供用户凭据以及我的客户端凭据,我确信它们是使用“php artisan passport:client --password”生成的(请注意--password选项)
  • 我可以毫无问题地获取访问令牌。我现在需要的是获取我刚刚从API REST进行身份验证的用户的JSON表示形式。但问题是:我只有一个访问令牌。我无法与用户产生任何联系。

或者我可以吗?也许我可以扩展验证密码授予请求的方法,以将生成的访问令牌与它正在进行身份验证的用户相关联... *灯泡打开*

使用应用程序测试代码:

try {
    $client = new Client();
    $result = $client->post('https://myapi.com/oauth/token', [
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => '5',
            'client_secret' => 'my_secret',
            'username' => 'user_I_am_authenticating',
            'password' => 'the_user_password',
            'scope' => '',
        ]
    ]);
    $access_token = json_decode((string) $result->getBody(), true)['access_token'];
    $result = $client->get('https://myapi.com/client/user', [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'Authorization' => "Bearer $access_token",
        ]
    ]);

    return (string) $result->getBody();
} catch (GuzzleException $e) {
    return "Exception!: " . $e->getMessage();
}

请注意,https://myapi.com/client/user 路由只是我在 API 中为测试而创建的路由。该路由定义为:

Route::get('/user', function(Request $request) {
    return $request->user();
});

现在。我知道这是行不通的。这就是我想要实现的目标。了解在给定access_token/bearer_token的情况下发出请求的用户。


答案 1

您忘记了相应的中间件。

Route::get('/user', function(Request $request) {
    return Auth::user();
})->middleware('auth:api');

当您未提及中间件时,不会触发身份验证流。这就是为什么你得到.authnull


答案 2

我和你有同样的问题。在我手动定义身份验证防护后,我解决了它。

Route::get('/user', function (Request $request) {
  return auth()->guard('api')->user();
});

推荐