Я написал простой REST API с помощью Laravel 11. Я протестировал аутентификацию, и похоже, что токен, сгенерированный Sanctum, не отозван, несмотря на то, что я удаляю так, как написано в документации.
class TokenController extends Controller
{
public function store(Request $request){
$fields = $request->validate([
'email' => ['required', 'email', 'max:255'],
'password' => ['required', 'string', 'max:255']
]);
$user = User::where('email', $fields['email'])->first();
if (!$user || !Hash::check($fields['password'], $user->password))
return response('authentication failed', 401);
$token = $user->createToken('the_token');
return response([
'plainText' => $token->plainTextToken
], 201);
}
public function destroy(Request $request){
$request->user('sanctum')->currentAccessToken()->delete();
return response(null, 204);
}
}
Когда я проверяю маршрут на уничтожение, я всегда получаю 204, а когда я сбрасываю идентификатор пользователя и токен, я всегда получаю одни и те же значения. Это не должно быть возможно, потому что я использую промежуточное программное обеспечение auth:sanctum
для маршрута, поэтому я думаю, что я должен получить 401 для второго вызова, потому что нет аутентифицированного пользователя или, по крайней мере, пустой идентификатор пользователя.
Я понятия не имею, что я делаю неправильно. Возможно, это проблема конфигурации, но когда я пытаюсь использовать Google или GPT, я обнаруживаю, что другие люди отзывали токены так же, как и я. Как я могу это исправить?
Проблема в тесте.
Здесь я обнаружил, что Laravel может поддерживать только один запрос для каждого теста: https://laravel.io/forum/revoking-sanctum-api-token-doesnt-appear-to-prevent-use
Поэтому мне пришлось переписать тест, чтобы проверять содержимое базы данных, вместо того, чтобы многократно запрашивать сервер.
public function test_deleting_token():void{
$user = User::create($this->user1);
$this->assertEquals($user->tokens()->get()->count(), 0);
$token = $user->createToken('the_token')->plainTextToken;
$this->assertEquals($user->tokens()->get()->count(), 1);
$response = $this->withToken($token)
->deleteJson('/api/tokens/current');
$response->assertStatus(204);
$this->assertEquals($user->tokens()->get()->count(), 0);
}
выключенный:
Я не люблю писать такого рода тесты, я имею в виду, что было бы намного лучше при тестировании написать историю о том, что пользователь был создан, пользователь вошел в систему, были добавлены некоторые сообщения и т. д. Разумеется. следовать им труднее, чем делать что-то изолированно.
Я загрузил код на github. Просто раскомментируйте эту часть неудачного теста: github.com/blablabla1234678/proba/blob/main/tests/Feature/… (обратите внимание, что сначала необходимо исправить файл .env для sqlite)