Как отозвать токен в Laravel Sanctum?

Я написал простой 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, я обнаруживаю, что другие люди отзывали токены так же, как и я. Как я могу это исправить?

Я загрузил код на github. Просто раскомментируйте эту часть неудачного теста: github.com/blablabla1234678/proba/blob/main/tests/Feature/… (обратите внимание, что сначала необходимо исправить файл .env для sqlite)

inf3rno 16.07.2024 17:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в тесте.

Здесь я обнаружил, что 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);
}

выключенный:

Я не люблю писать такого рода тесты, я имею в виду, что было бы намного лучше при тестировании написать историю о том, что пользователь был создан, пользователь вошел в систему, были добавлены некоторые сообщения и т. д. Разумеется. следовать им труднее, чем делать что-то изолированно.

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

Как просмотреть изображение с помощью Vue JS
Сервисы Laravel, следует ли нам внедрять классы моделей или просто использовать их при импорте?
Докер-контейнер MySQL завис при перезагрузке
Ошибка: 1826 Повторяющееся имя ограничения внешнего ключа «id»
Я продолжаю получать эту ошибку «Невозможно получить доступ к смещению строки типа в строке» всякий раз, когда пытаюсь передать фиктивные данные в свое приложение Laravel
Laravel 11 Heroku: файл базы данных по пути [/app/database/database.sqlite] не существует
Я получаю сообщение об ошибке после установки Laravel через HERD
Проверьте, существует ли UUID в таблице A или таблице B, используя правила проверки (проверка Laravel)?
Неустранимая ошибка: вызов неопределенного метода Google\Cloud\Firestore\QuerySnapshot::count()
Ошибка интеграции Alpine.js 3.x и Chart.js: «Необработанная ошибка типа: невозможно прочитать свойства со значением null (чтение «сохранить»)»