有没有一种方法可以使用改造来刷新带有计时器的令牌?

Posted

技术标签:

【中文标题】有没有一种方法可以使用改造来刷新带有计时器的令牌?【英文标题】:Is there a method to refresh token with timer using retrofit? 【发布时间】:2021-03-21 01:37:36 【问题描述】:

我正在尝试使用改造从 api 检索数据。将要使用的请求需要一个访问令牌来传递标头。问题是令牌在 10 分钟后过期,刷新令牌请求需要一个未过期的令牌来创建一个新令牌! 那么我应该怎么做才能让令牌在通过 10 分钟之前自行刷新呢? 我已经尝试过 Interceptor 但它无法解决此类问题,因为我需要一个有效的令牌才能获得一个新的

【问题讨论】:

你使用拦截器的方式是拦截改造的第一个失败的请求,然后当场执行刷新令牌方法,并用新创建的令牌替换旧的 API 请求,然后您将重试,这一切都发生在拦截器内部,并且可能非常错误且难以维护,请查看我的答案,如果您需要进一步的帮助,请告诉我 【参考方案1】:

您可以使用 Worker 并将其设置为每 30 分钟左右运行一次,并将其设置为将更新的令牌保存在您的 SharedPreference

这是Worker 的示例

class UpdateTokenWorkManger(
val context: Context,
params: WorkerParameters) : Worker(context, params) 

override fun doWork(): Result 

    LoginHandler.refreshTokenSilently()

    // Indicate whether the work finished successfully with the Result
    return Result.success()


companion object 
    private const val TAG = "Token Refresh "
    const val TOKEN_REFRESH_WORK_MANGER_ID = "automatic_renew_token_work_manger"
    fun renewToken() 
        val periodicRefreshRequest = PeriodicWorkRequest.Builder(
            UpdateTokenWorkManger::class.java, // Your worker class
            30, // repeating interval
            TimeUnit.MINUTES
        )

        val periodicWorkRequest: PeriodicWorkRequest = periodicRefreshRequest
            .build()
        WorkManager.getInstance(App.getApplication()).enqueueUniquePeriodicWork(
            TOKEN_REFRESH_WORK_MANGER_ID,
            ExistingPeriodicWorkPolicy.REPLACE,
            periodicWorkRequest
        )
    

要使用此组件,您将需要这些依赖项

implementation "androidx.work:work-runtime-ktx:2.4.0"

还请注意,LoginHandler 是应该负责处理您的登录、刷新和注销方案的类。

并且不要忘记在登录Activity 之后将此行添加到您的第一个Activity,例如:如果您登录SplashActivity 并在成功验证后重定向到MainActivity,那么此行应该在MainActivity'sonCreate函数中

UpdateTokenWorkManger.renewToken()

【讨论】:

我试过这段代码,但我不知道为什么在日志中 doWork 函数只工作一次。我想问你关于 App.getApplication() 如果我在 renewToken 函数中传递一个上下文作为替代,这是否正常?并感谢您的回答,我真的很感激 哦,我每次都在 Result.success() 的 1 分钟内测试它的问题,所以 workmanager 不会重复工作 你可以设置任何你想要的时间间隔,但最小值是 15 分钟,所以你必须至少输入 15 进行测试 如果我的回答对您有所帮助,如果您能将其标记为解决方案,我将不胜感激 是的,但令牌每 10 分钟刷新一次,我需要在这之前更新它,这就是我面临的问题,我认为可能 alarmManager 更适合我的问题不是吗?

以上是关于有没有一种方法可以使用改造来刷新带有计时器的令牌?的主要内容,如果未能解决你的问题,请参考以下文章

在改造并行网络调用中处理后台刷新令牌调用

改造 - 处理刷新令牌过期

了解 Laravel Passport 刷新令牌

身份服务器刷新令牌资源所有者密码凭证流

需要帮助尝试在本机反应中刷新我的令牌

JWT 刷新令牌 Angular