2017-07-26 74 views
0

我正在用JWT构建我的第一个API。我正在使用这个样板项目:https://github.com/krisanalfa/lumen-jwt在Laravel上使用JWT刷新令牌的流程流明

我设法使它工作正常,但我有一个很大的问题:用户令牌在一段时间后过期,将用户从应用程序中注销。我已阅读该项目的文档,致电/api/auth/refresh刷新令牌,但现在看来它有两个主要缺点:

1)您必须制作一个只需要调用API来刷新令牌,我会想象你需要设置一个计时器来每隔X分钟(令牌到期时间)调用它。

2)如果用户关闭计算机3小时,当他重新打开计算机时,令牌已经过期,导致刷新不可用,并将用户关闭。

由于我是新手,我错过了什么?我怎样才能使令牌刷新周期工作没有这些缺点?

回答

1

考虑你的两点。

1)您可以使令牌仅适用于单次使用,但使用黑名单功能。然而这不是完全必要的。

在我自己的项目中,我给了令牌5分钟过期,但我也将jwt-refresh中间件应用到了我的已认证路由(包装在路由组中),以便每个请求都返回一个新令牌。

2)你也可以指定一个刷新到期,这是在此期间到期的令牌可以被验证的窗口。这通常比令牌长得多。我用了14天。

因此,如果用户离开您的网站3小时后又回来,他们的代币将会过期。但是,您的应用程序应尝试在后台刷新该令牌,然后重新尝试原始请求。

给出一些思考相应令牌生命期的明显安全含义。 5分钟是被滥用的短时间窗口,但如果过期的令牌可以刷新长达14天,则会增加风险,除非您将其列入黑名单。

+0

我试图做到这一点,但显然当我呼叫Refresh时,Dingo正在检查令牌有效性,并且我仍然收到消息:“令牌已过期”。任何想法可能发生什么? – raphadko

+0

这是因为刷新路径'api.auth.refresh'位于'api.auth'中间件组中。所以中间件在它到达控制器路由之前正在检查有效性。如果你将它移到外面,它可能会起作用。 – fubar

+0

我正在使用jwt.refresh中间件,对第一个请求很好,然后我无法读取响应中的新令牌。当我做console.log(request.getAllResponseHeaders());它不显示令牌,只显示“Content-Type:application/json Cache-Control:private,must-revalidate”。任何想法如何阅读它? – raphadko