22

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

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

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

    return $user;
});

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

澄清事情:

  • 我有一个 API REST 应用程序,即 oAuth2 服务器。
  • 我有另一个使用 API REST 的应用程序。
  • 我确实知道工作流程。在我的情况下,使用密码授予,我在我的消费者应用程序中获取用户凭据,然后我向 /oauth/token 发出请求,将grant_type指定为password,我提供用户凭据以及我的客户端凭据,我确信他们使用“ 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 的情况下,了解发出请求的用户。

4

3 回答 3

25

您忘记了适当的中间件。

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

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

于 2017-04-03T22:06:00.613 回答
22

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

Route::get('/user', function (Request $request) {
  return auth()->guard('api')->user();
});
于 2018-05-25T15:13:10.797 回答
4

您需要将访问令牌与每个请求一起传回。请在此处查看此部分的文档

于 2017-02-02T09:46:12.263 回答