Я пытаюсь понять, как протестировать мою функцию выхода из системы, управляемую паспортом, которая выглядит так:
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(). Что могло привести к его такому исчезновению?






Немного поздно, но, возможно, кому-то это пригодится. Чтобы протестировать предоставленную вами функцию выхода из системы, вам необходимо передать токен в качестве заголовка авторизации.
$response = $this->post('/logout', [], ['Authorization' => 'Bearer ' . $token])
->assertStatus(200);
Я не уверен, почему, но токен доступа не может быть получен с помощью $user->token() при использовании actionsAs, но его можно получить с помощью $user->tokens()->first()
.