简体   繁体   English

注销不适用于Laravel JWT-auth

[英]Logout doesn't work with Laravel JWT-auth

I'm using JWT-auth with Laravel Framework to authenticate a user. 我正在使用带有Laravel Framework的JWT-auth来认证用户。 Laravel is used as server-end framework and the fore-end code is in the framework which is developed by our own. Laravel用作服务器端框架,前端代码在我们自己开发的框架中。 So we use api not web to realize authentication. 因此,我们使用api而非web来实现身份验证。 Login works well in this environment, whereas logout and refresh token can't perform as I wish. 登录在此环境中效果很好,而注销和刷新令牌无法按我希望的那样执行。 I configure everything as JWT-auth documentation says. 我按照JWT-auth文档所述配置所有内容。

route.php 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 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 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',
    ],*/
],

User\\AuthController 用户\\ 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' can't be logged. 无法记录“ yyyyyyyyy”。 So it seems that the logout function in AuthController wasn't called. 因此,似乎未调用AuthController中的logout功能。

Is there anything wrong I've written or missed? 我写或错过了什么错吗? Thanks in advance. 提前致谢。

After a few tryings, I've changed the AuthController's constructor and it worked. 经过几次尝试,我已经更改了AuthController的构造函数,并且可以正常工作。

User\\AuthController 用户\\ AuthController

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

I've added functions as value of 'except', in which I expected to invalidate the present session. 我已将函数添加为'except'的值,我希望其中的当前会话无效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM