Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 运行“a”的最佳方法;普通的;在任何其他REST调用之前进行REST调用_Android_Rest_Jersey_Retrofit_Jwt - Fatal编程技术网

Android 运行“a”的最佳方法;普通的;在任何其他REST调用之前进行REST调用

Android 运行“a”的最佳方法;普通的;在任何其他REST调用之前进行REST调用,android,rest,jersey,retrofit,jwt,Android,Rest,Jersey,Retrofit,Jwt,我有一个用JWT保护的RESTAPI。客户端是一个Android应用程序和一个web应用程序。当用户登录时,Android应用程序会获得一个新的令牌,然后使用该令牌。但是,令牌将在60分钟后过期,因此我必须刷新它。我知道这有三种方法 在每个请求中发出一个新令牌 当当前令牌即将过期时发出新令牌。e、 g.10 闵 让客户端应用程序在需要时使用“刷新”请求新令牌 api的“服务” 请考虑以下……/P> 我对上面的第一个建议不满意 我确实试过第三个建议。然而,在我的android应用程序中,我接

我有一个用JWT保护的RESTAPI。客户端是一个Android应用程序和一个web应用程序。当用户登录时,Android应用程序会获得一个新的令牌,然后使用该令牌。但是,令牌将在60分钟后过期,因此我必须刷新它。我知道这有三种方法

  • 在每个请求中发出一个新令牌
  • 当当前令牌即将过期时发出新令牌。e、 g.10 闵
  • 让客户端应用程序在需要时使用“刷新”请求新令牌 api的“服务”

请考虑以下……/P>

  • 我对上面的第一个建议不满意
  • 我确实试过第三个建议。然而,在我的android应用程序中,我接到了大约60个REST电话。然后我应该做的是处理每个REST调用(例如:
    getUsers()
    ),我首先必须检查令牌是否即将过期,如果是,则从RESTAPI获取一个新令牌(这意味着我必须对API中的
    refresh()
    方法运行另一个REST调用)。检查并获取新令牌后,我可以执行
    getUsers()
    方法。这里的问题是,每个REST调用都应该在我的
    refresh()
    方法(我使用的是改型)的
    onResponse()
    方法中运行,这是不可能的,因为我必须用60个名称重复相同的方法60次。我相信同样的问题也会出现在web应用程序中
由于上述原因,我正在考虑我的第一个列表中的第二个建议,即在服务器上更新令牌。如果令牌是“有效的”,如果它是“即将到期”,我将刷新它从服务器,并将发送到应用程序作为标题

我需要知道这种方法是否是一种行业实践方法,以及它是什么样的最佳选择。如果没有,我如何继续我第一个列表中的第三个建议。

我最近在我的一个Android应用程序中使用JWT实现了类似的设置。我不知道我的建议是否对你有帮助,但它可能会让你了解别人是如何做的

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

选项2:这需要服务器端额外的操作,而且这是不可行的。您计划如何检测哪些令牌已经分发并且“即将过期”,以便您可以续订它们?成吨的用户将拥有成吨的令牌,若您计划在数据库中保存JWT,那个么它将变得太混乱

选项3:此方法太冗余,需要客户端操作来检查令牌是否即将过期,并在此基础上调用刷新服务。我总是喜欢少做手术,多做工作


我所做的是,我为系统使用了两个令牌。一个作为刷新令牌(用于请求JWT刷新的令牌),另一个作为JWT(用于每个请求验证)

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

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

由于我需要在每个HTTP响应中添加此检查(是否包含“Session Expired”),因此我编写了一个公共函数,并通过该方法传递HTTP响应,因此,我不需要重写或复制粘贴它的每一位

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

现在还不清楚用户是否必须每次登录你的应用程序或会话,以便登录的用户可以直接进入应用程序。如果会话处于保留状态,只需将refreshToken保存在本地应用程序中(SharedPref),并在每次打开应用程序时使用它获取JWT。如果任何用户误用了您的API(刮取或用于任何其他目的),只需将特定的刷新令牌移动到黑名单,这样该用户就不会获得新的JWT

如果有什么不清楚的,请告诉我。谢谢。

我最近在我的一个Android应用程序中使用JWT实现了类似的设置。我不知道我的建议是否对你有帮助,但它可能会让你了解别人是如何做的

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

选项2:这需要服务器端额外的操作,而且这是不可行的。您计划如何检测哪些令牌已经分发并且“即将过期”,以便您可以续订它们?成吨的用户将拥有成吨的令牌,若您计划在数据库中保存JWT,那个么它将变得太混乱

选项3:此方法太冗余,需要客户端操作来检查令牌是否即将过期,并在此基础上调用刷新服务。我总是喜欢小一点的