Выход из системы при тестировании с помощью Laravel Passport

Я пытаюсь понять, как протестировать мою функцию выхода из системы, управляемую паспортом, которая выглядит так:

public function logout() {
        $accessToken = auth()->user()->token();

        $refreshToken = DB::table('oauth_refresh_tokens')
            ->where('access_token_id', $accessToken->id)
            ->update([
                'revoked' => true
            ]);

        $accessToken->revoke();

        return response()->json(['status' => 200]);
    }

Я использую помощник Passport, выполняющий роль помощника при настройке ответа.

    Passport::actingAs(
            $user,
            ['read write']
        );
$response = $this->post('/logout')
                ->assertStatus(200);

Тест не проходит, так как код выдает ошибку 500, так как auth()->user()->token() ... пустой? Например, $accessToken->id равен 0, чего не должно быть, что означает сбой кода.

В чем я не уверен, так это в том, является ли это ожидаемым поведением из-за того, как работает помощник Passport actAs, и я не могу на самом деле протестировать функцию выхода, или что-то не так с моей функцией выхода. Халп!

Мои маршруты:

Route::post('login', 'Auth\LoginController@login');

Route::group(['middleware' => 'auth:api'], function() {
    Route::post('logout', 'Auth\LoginController@logout');
});

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

JsonApi::register('v1', ['namespace' => 'Api'], function (Api $api, $router) {
    $api->resource('training-locations');
    $api->resource('courses');
});

ETA: Моя функция входа в систему, если это полезно:

public function login(Request $request, Client $client){
        $this->validateLogin($request);

        if ($this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);

            return $this->sendLockoutResponse($request);
        }

        $response = $client->post(config('app.url') . '/oauth/token', [
            'form_params' => [
                'client_id' => config('auth.proxy.client_id'),
                'client_secret' => config('auth.proxy.client_secret'),
                'grant_type' => config('auth.proxy.grant_type'),
                'username' => $request->email,
                'password' => $request->password,
                'scopes' => '[read write]'
            ]
        ]);

        if ($response->getStatusCode() === 200) {
            $this->clearLoginAttempts($request);

           return response($response->getBody()->getContents(), $response->getStatusCode());
        }

        $this->incrementLoginAttempts($request);

        return response($response->getBody()->getContents(), $response->getStatusCode());
    }

Чтобы выяснить, действительно ли это проблема, я попытался подключиться к конечной точке через Postman. Попадает в функцию, а вот auth()->user() не находит. Я попробовал несколько других конечных точек, использующих ту же группу маршрутов, и мне удалось найти с ними auth()->user(). Что могло привести к его такому исчезновению?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
0
2 524
1

Ответы 1

Немного поздно, но, возможно, кому-то это пригодится. Чтобы протестировать предоставленную вами функцию выхода из системы, вам необходимо передать токен в качестве заголовка авторизации.

$response = $this->post('/logout', [], ['Authorization' => 'Bearer ' . $token])
                ->assertStatus(200);

Я не уверен, почему, но токен доступа не может быть получен с помощью $user->token() при использовании actionsAs, но его можно получить с помощью $user->tokens()->first() .

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