2017-04-04 37 views
1

我有一个使用JWT进行保护的REST API。客户端是一个Android应用程序和一个Web应用程序。 Android应用程序在用户登录时获取新的令牌,之后它将与该令牌一起使用。但令牌将在60分钟内过期,因此我必须刷新它。我知道这有3种方法。在任何其他REST调用之前运行“公共”REST调用的最佳方法

  • 问题一个新的令牌在每次请求
  • 问题时,当前已接近过期新鲜的令牌。例如10 分钟
  • 让利客户端应用程序的请求时,它需要它采用了全新的令牌的“刷新 服务”你的API。

请考虑以下...

  • 我不开心的第一个建议上述
  • 我也尝试了第三项建议。然而,在我的Android应用程序中,我有60个REST调用。那么我应该做的是每个REST调用(例如:getUsers()),我首先必须检查令牌是否即将过期,如果是,则从REST API获取新令牌(这意味着我必须运行另一个REST调用API中的refresh()方法)。在检查并获取新令牌后,我可以执行getUsers()方法。这里的问题是,每个REST调用都应该在我的refresh()方法(我正在使用Retrofit)的onResponse()方法中运行,而这根本不可能,因为我必须用60个名称重复相同的方法60次。我相信Web应用也会出现同样的问题。

由于上述原因,我正在考虑我的第一个列表中的第二个建议,在它自己的服务器上续订令牌。如果令牌是“有效的”,并且“即将到期”,我将从服务器刷新它并将作为头部发送到应用程序。

我需要知道该方法是否是一个行业实践方法和whather它是最好的选择。如果不是,我可以如何在第一份清单中继续进行第三项建议。

回答

0

我最近实施的智威汤逊的类似设置在我的Android应用程序之一。我不知道我的建议是否会对你有所帮助,但它可能会让你了解别人是如何做到的。

选项1:这非常多余,它违反了首先使用JWT的唯一目的。如果每次请求都获得新的JWT,我可以将其用于进一步的请求,因此实际上有一个令牌没有到期。

选项2:这需要服务器端的额外操作,再加上这是不可行的。您如何计划检测哪些令牌已经分发并“即将到期”,以便您可以续订?大量的用户将拥有大量的令牌,如果您计划将JWT保存在数据库中,那么它会变得太杂乱。

选项3:该方法过于简化,需要客户端操作来检查令牌是否即将过期并基于该方法调用刷新服务。我总是喜欢较少的手术来做更多的工作。


我所做的,就是,我用了两个代币系统。一个为刷新令牌(用于请求JWT刷新令牌)和一个为JWT(为每个请求确认)

成功登录后,收到刷新令牌并将其保存在本地应用(SharedPref)。该令牌也保存在数据库中。接下来,使用该刷新令牌请求并验证JWT。从现在开始,每个请求都包含这个JWT头文件。每当我的应用程序打开时,我也会请求新的JWT,即在我的Splash页面中。

现在,如果任何请求包含过期的JWT,只需返回一个常见的响应,如“Session expired”带有固定状态码。如果任何HTTP请求在其响应中包含此特定状态代码,则我会请求另一个带有刷新令牌的API调用,以便为将来的请求获取新的JWT。

当我需要增加这个检查在每一个HTTP响应(是否包含“会话过期”),我写了一个共同的功能,并通过该方法通过HTTP响应,这样,我不需要重写或复制粘贴它的每一个位。

这需要在服务器和应用程序端非常少的代码和最小的操作。我的系统的智威汤逊到期时间为20分钟,直到现在我还没有遇到任何问题。最糟糕的情况是,在单个请求中,用户收到令牌过期,获取令牌,并且调用该函数。这会导致已经在我的应用中持续超过20分钟的用户稍微延迟一次操作。如果有任何用户长时间在我的应用程序中,这是一个很好的问题,对吗? :)

目前尚不清楚用户是否每次都登录在你的应用程序或会话保持,使得注册用户可以直接进入应用程序。如果会话保持,只要保持在refreshToken本地应用(SharedPref)并使用每个应用程序打开时获得JWT。如果任何用户被误用的API(刮削或用于任何其他目的),仅仅是特定刷新令牌移动到黑名单,这样该用户没有得到新的智威汤逊。

请让我知道如果有什么不清楚。谢谢。

+0

谢谢你的回复。 '这需要服务器端额外的操作,再加上这是不可行的。您如何计划检测哪些令牌已经分发并“即将到期”,以便您可以续订?吨的用户将有吨的令牌,如果你打算将JWT保存在数据库中,那么它会变得太混乱。“ - 我不能同意。智威汤逊拥有到期声明,并且不需要数据库。如果令牌有效,那么它已经分发,如果它有用户名声明,那么我们知道它到底是谁,如果它有过期日期,那么我们知道何时会过期。 –

+0

'因为我需要在每个HTTP响应中添加此检查(不管是否包含“Session Expired”),所以我编写了一个通用函数并通过该方法传递了HTTP响应,因此,我不需要重写或复制粘贴每个 - 所以,你需要在提到的方法的'onResponse'右边写另一个方法吗?否则,如果两者同时运行,这将是一个问题;你是怎么做的 ? –

+0

好的,我不明白你在这里说的方法,但我现在明白了。这似乎是我的建议的一个变种,将操作从客户端转移到在服务器端和客户端之间进行分配。这个解决方案导致一个API调用,所以可能比我的要快一些。 但我没有得到一个问题,但如果用户登录,获得JWT,将应用程序移动到后台并在60分钟或更长时间后从应用程序重新打开应用程序,该怎么办?这种情况如何处理?我经常遇到这种情况,因为大多数用户不关闭应用程序,只是在其上打开另一个应用程序。 –

相关问题