我使用Lumen和JWT身份验证时遇到一个奇怪的错误。我们创建了一个移动应用程序和一个Web应用程序,并使用JWT Auth对用户进行身份验证。当出现一些错误时,我们已添加了一些电子邮件日志记录,因此我们可以对其进行热修复。
问题解释:有时,我们的用户通过JWT中间件或Guard,并且执行了经过身份验证保护的代码。
今天早晨,我们收到了如下所示的SQL错误:
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLmltZ3VyLmNvbS9jRW5LZ3hXLnBuZyJ9” alt =“错误图片”>例如,我们有一个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
任何人都经历过这个问题或有任何想法为什么会发生这种情况?谢谢!
尝试:
if(!Auth::check() || Auth::user() == NULL) {
Auth::logout();
return abort(401, 'Unauthorized.');
}
由于在用户is进行身份验证时Auth:check()
返回true
,所以如果出现以下情况,您想要的是中止:
[用户未认证]或[用户为
null
]