我有一个使用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它是最好的选择。如果不是,我可以如何在第一份清单中继续进行第三项建议。
谢谢你的回复。 '这需要服务器端额外的操作,再加上这是不可行的。您如何计划检测哪些令牌已经分发并“即将到期”,以便您可以续订?吨的用户将有吨的令牌,如果你打算将JWT保存在数据库中,那么它会变得太混乱。“ - 我不能同意。智威汤逊拥有到期声明,并且不需要数据库。如果令牌有效,那么它已经分发,如果它有用户名声明,那么我们知道它到底是谁,如果它有过期日期,那么我们知道何时会过期。 –
'因为我需要在每个HTTP响应中添加此检查(不管是否包含“Session Expired”),所以我编写了一个通用函数并通过该方法传递了HTTP响应,因此,我不需要重写或复制粘贴每个 - 所以,你需要在提到的方法的'onResponse'右边写另一个方法吗?否则,如果两者同时运行,这将是一个问题;你是怎么做的 ? –
好的,我不明白你在这里说的方法,但我现在明白了。这似乎是我的建议的一个变种,将操作从客户端转移到在服务器端和客户端之间进行分配。这个解决方案导致一个API调用,所以可能比我的要快一些。 但我没有得到一个问题,但如果用户登录,获得JWT,将应用程序移动到后台并在60分钟或更长时间后从应用程序重新打开应用程序,该怎么办?这种情况如何处理?我经常遇到这种情况,因为大多数用户不关闭应用程序,只是在其上打开另一个应用程序。 –