Laravel 5.3 使用 JWT Auth 时限制登录
Posted
技术标签:
【中文标题】Laravel 5.3 使用 JWT Auth 时限制登录【英文标题】:Laravel 5.3 Throttle Login When Using JWT Auth 【发布时间】:2017-05-29 23:29:48 【问题描述】:我将 JWT 用于我的 Laravel + Angular 应用程序。我看到 Laravel 5.3 具有开箱即用的登录限制功能。但是在使用 JWT Auth 时,我怎样才能让它工作呢?我有以下代码,但登录限制不起作用。尽管尝试了无数次失败,但我只收到Invalid Login Details
错误,但它没有限制并显示Too many logins
错误:
class LoginController extends Controller
use AuthenticatesUsers;
protected $maxLoginAttempts=5;
protected $lockoutTime=300;
public function login(Request $request)
$credentials = $request->only('email', 'password');
$this->validate($request, [
'email' => 'required',
'password' => 'required',
]);
if ($this->hasTooManyLoginAttempts($request))
$this->fireLockoutEvent($request);
return response()->json(['error' => 'Too many logins'], 400);
try
if (! $token = JWTAuth::attempt($credentials))
return response()->json(['error' => 'Invalid Login Details'], 401);
catch (JWTException $e)
// something went wrong
$this->incrementLoginAttempts($request);
return response()->json(['error' => 'Could Not Create Token'], 500);
// if no errors are encountered we can return a JWT
return response()->json(compact('token'));
您如何使用 JWTAuth 来使用此功能?有人能帮帮我吗?
【问题讨论】:
【参考方案1】:这是因为您的 JWTAuth 没有抛出异常来增加您的登录尝试。只需将$this->incrementLoginAttempts($request);
放入验证失败的条件中,如下所示:
if (! $token = JWTAuth::attempt($credentials))
$this->incrementLoginAttempts($request);
return response()->json(['error' => 'Invalid Login Details'], 401);
【讨论】:
感谢@Rafal 的回复和好点。我在登录尝试中添加了增量,但即使尝试失败,它仍然只显示Invalid Login Details
错误消息。
你使用的是什么缓存,它工作正常吗? RateLimiter 正在使用缓存,所以这可能是个问题。
对不起,你指的是缓存驱动吗?我将其设置为CACHE_DRIVER=array
。使用 JWT 而不是默认的 Auth 也会是不工作的原因吗?
array - 会话存储在一个简单的 php 数组中,不会跨请求持久化。 这就是它不起作用的原因。将缓存更改为一些可持久的请求,例如本机会话或内存缓存
很高兴它有帮助!我建议仅将数组缓存用于测试目的。以上是关于Laravel 5.3 使用 JWT Auth 时限制登录的主要内容,如果未能解决你的问题,请参考以下文章