Выход из системы с помощью 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 actAs для настройки ответа.

    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(). Из-за чего он может так пропадать?


person llhilton    schedule 07.12.2018    source источник


Ответы (1)


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

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

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

person Stefan Tanevski    schedule 25.06.2019