Lumen JWT身份验证通过防护

时间:2019-06-20 05:46:43

标签: php laravel api jwt lumen

使用Lumen和JWT身份验证时出现一个奇怪的错误。 我们创建了一个移动应用程序和一个Web应用程序,并使用JWT Auth对用户进行身份验证。当出现一些错误时,我们添加了一些电子邮件日志记录,以便我们进行热修复。

问题解释: 有时,我们的用户会通过JWT中间件或Guard,而被执行为经过身份验证保护的代码会执行。

今天早晨,我们收到了如下的SQL错误:

Error Image 例如,我们有一个MobileController女巫扩展了主要的Controller。在主控制器中,我们使用__construct方法编写了这段代码

if(Auth::check() && Auth::user() == NULL) {
    Auth::logout();
    return abort(401, 'Unauthorized.');
}

即使使用上述代码,用户也会通过身份验证保护。

这是我们的代码示例:

routes / web.php

$router->group(['middleware' => 'auth:user'], function ($router) {
    $router->group(['prefix' => 'mobile/'], function ($router) {
        $router->post('/company/department', ['uses' => 'MobileController@createCompanyDepartment']);
    });
});

app / Http / Controllers / Controller.php

class Controller extends BaseController
{
    /**
     * Assigned table
     * for this model
     *
     * @var string
     */
    protected $user;
    protected $client;
    protected $company;

    public function __construct()
    {
        if(Auth::check() && Auth::user() == NULL) {
            Auth::logout();
            return abort(401, 'Unauthorized.');
        }

        if(Auth::guard('user')->check()) {
            $this->user = Auth::user();
            $this->company = Company::join('languages', 'languages.id', '=', 'companies.language_id')
                ->select('companies.*', 'languages.code as language_code')
                ->find($this->user->company_id);
        } else if(Auth::guard('client')->check()) {
            $this->client = Auth::guard('user')->client();
        } else {
            $this->user = NULL;
        }
    }
}

app / Http / Controllers / MobileController.php

public function createCompanyDepartment(Request $request)
{
    $this->validate($request, [
        'name'  => 'required',
    ]);

    Department::createDepartment($this->user->company_id, $request->input('name'));
    $response = Department::getMobileDepartmentsByCompany($this->user);

    return response()->json($response);
}

我们希望未授权的用户会收到“未授权的401”错误,但某些东西会越过后卫。如果我们尝试在未经身份验证的本地运行代码,则会收到“未授权401”消息,但在生产环境中,有时我们的用户会越过保护措施。 令牌可能过期了?这是我的.env

AUTH_GUARD=user
JWT_KEY=XXXXXXXXXXXXXXXXXXXXX
JWT_EXPIRE_AFTER=25920000

任何人都经历过这个问题或有任何想法为什么会发生这种情况?谢谢!

1 个答案:

答案 0 :(得分:0)

尝试:

if(!Auth::check() || Auth::user() == NULL) {
    Auth::logout();
    return abort(401, 'Unauthorized.');
}

由于Auth:check()在用户得到认证后返回true ,因此,如果发生以下情况,您要中止的操作:

[用户未通过身份验证]或[用户是null]