Выход из системы не работает с Laravel JWT-auth

Я использую JWT-auth с Laravel Framework для аутентификации пользователя. Laravel используется как серверный фреймворк, а внешний код находится в фреймворке, который мы разрабатываем самостоятельно. Поэтому для аутентификации мы используем API, а не Интернет. Вход в систему работает хорошо в этой среде, тогда как токен выхода и обновления не может работать так, как я хочу. Я настраиваю все, как указано в документации JWT-auth.

route.php

Route::group(['middleware' => 'api', 'prefix' => 'user', 'namespace' => 'User'], function () {
   Route::post('/login', 'AuthController@login'); // login
   Route::post('/logout', 'AuthController@logout'); // logout (invalidate token)
   Route::post('/refresh', 'AuthController@refresh'); // refresh token});

kernel.php

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

auth.php

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

'providers' => [
    'users' => [
        'driver' => 'password',
        'model' => App\User::class,
    ],

    /*'users' => [
        'driver' => 'database',
        'table' => 'user',
    ],*/
],

Пользователь \ AuthController

<?php

namespace App\Http\Controllers\User;

use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use AjaxResponse;
use Log;

class AuthController extends Controller
{
    /**
     * Create a new AuthController instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login']]);
    }

    /**
     * login
     * @param Request $request 
     * @return mixed
     */
    public function login(Request $request)
    {
        $credentials = $request->only('phone', 'password');

        if (! $token = auth()->attempt($credentials)) {
            return AjaxResponse::fail(4001);
        }

        return $this->respondWithToken($token);
    }

    /**
     * logout(invalidate token)
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        Log::debug('yyyyyyyyy');
        auth()->logout();

        return AjaxResponse::succeed(['message' => 'Successfully logged out']);
    }

    /**
     * refresh token
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken(auth()->refresh());
    }

    /**
     * get token structure
     * @param $token
     * @return mixed
     */
    protected function respondWithToken($token)
    {
        if (Auth::user()['deleted_at'] || ! Auth::user()['is_active'])
            return AjaxResponse::fail(4001);
        else
            return AjaxResponse::succeed([
                'access_token' => $token,
                'token_type' => 'bearer',
                'expires_in' => auth()->factory()->getTTL() * 60,
                'user_name' => Auth::user()['name'],
                'user_admin' => (bool)Auth::user()['is_admin']
            ]);
    }
}

Здесь публикуется мой ответ на выход из системы.

'yyyyyyyyy' не может быть зарегистрирован. Похоже, что функция logout в AuthController не была вызвана.

Я что-то не так написал или пропустил? Заранее спасибо.


person Vogel_guo    schedule 22.02.2019    source источник
comment
Журнал сообщений yyyyyyyyy работает? сообщение 'Successfully logged out' возвращается? Или это просто токен, который не является недействительным?   -  person Clément Baconnier    schedule 22.02.2019
comment
@cbaconnier Я только что обновил свой вопрос. Пожалуйста, проверьте это еще раз.   -  person Vogel_guo    schedule 24.02.2019
comment
Ваш скриншот - это результат вашего POST, когда вы нажимаете /logout, верно? В этом случае ваш запрос может быть неверным. Поскольку вы используете API, он должен быть Content-Type: application/json, а заголовок должен содержать Authorization: Bearer <token>   -  person Clément Baconnier    schedule 25.02.2019
comment
В дополнение к тому, что я объяснил: ваш запрос может быть неправильным. Я предполагаю это, поскольку вижу скриншот HTML. Laravel обычно перенаправляет вас на /login (не /api/login), потому что он не видит запрос как json и не видит, что вы аутентифицированы.   -  person Clément Baconnier    schedule 25.02.2019
comment
@cbaconnier Я нашел способ заставить его работать, тем не менее, я не объясняю логику четко.   -  person Vogel_guo    schedule 11.03.2019


Ответы (1)


После нескольких попыток я изменил конструктор AuthController, и он заработал.

Пользователь \ AuthController

public function __construct()
{
    $this->middleware('auth:api', ['except' => ['login', 'refresh', 'logout']]);
}

Я добавил функции как значение 'except', в которых я ожидал сделать текущий сеанс недействительным.

person Vogel_guo    schedule 11.03.2019