Получите аутентифицированного пользователя с Laravel Passport и предоставьте пароль

Я сделал API REST с Laravel и теперь пытаюсь его использовать. Дело в том, что мне нужно аутентифицировать пользователей в 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/ токену, указав тип_пользователя для пароля, я предоставляю учетные данные пользователя вместе с моими учетными данными клиента, которые, я уверен, они были созданы с помощью " php artisan passport: client --password " (обратите внимание на параметр --password)
  • Я могу получить токен доступа без проблем. Теперь мне нужно получить представление JSON пользователя, которого я только что аутентифицировал, из API REST. Но вот проблема: у меня просто есть токен доступа. Я ничего не могу связать с пользователем.

Или я могу? Может быть, я могу расширить метод, который аутентифицирует запросы на предоставление пароля, чтобы связать сгенерированный токен доступа с пользователем, которого он аутентифицирует... * лампочка включается *

Использование тестового кода приложения:

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.

Благодарю.

3 ответа

Вы забыли соответствующее промежуточное программное обеспечение.

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

Поток аутентификации не запускается, когда вы не упоминаете auth промежуточное программное обеспечение. Вот почему вы получаете null,

У меня была такая же проблема с тобой. И я решил это после того, как я вручную определил auth guard.

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

Вам необходимо передавать токен доступа при каждом запросе. Пожалуйста, проверьте документацию для этой части здесь

Другие вопросы по тегам