首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AppAuth库-我们如何刷新令牌?

AppAuth库-我们如何刷新令牌?
EN

Stack Overflow用户
提问于 2022-02-21 18:31:33
回答 1查看 820关注 0票数 3

我的问题与用户问问题的问题基本相同:安卓的AppAuth库缺乏适当的文档。

当当前访问令牌过期时,我的问题就会发生,这会阻止我的应用程序内部的API通信。为了防止这种情况,我强迫TokenInterceptorgetAccessToken方法(它使用AppAuth的performActionWithFreshTokens方法)获取每个请求上的令牌,据说该方法执行令牌刷新请求(我查看了它的代码)。但是,它总是为我抛出一个带有错误invalid_grantinvalid_grant

这是我的应用程序第一次崩溃,但工作良好后,重新启动。所以令牌会刷新,不是吗?

代码语言:javascript
复制
class TokenInterceptor @Inject constructor(
        private val authStateStorage: AuthStateStorage,
        private val authService: AuthorizationService
): Interceptor {
    private companion object {
        const val TAG = "TokenInterceptor"
        const val AUTH_HEADER = "Authorization"
    }

    override fun intercept(chain: Interceptor.Chain): Response {
        var request = chain.request()
        request.header(AUTH_HEADER) ?: run {
            request = chain.request()
                    .newBuilder()
                    .addHeader(AUTH_HEADER, "Bearer ${getAccessToken()}")
                    .build()
        }
        return chain.proceed(request)
    }

    private fun getAccessToken(): String = runBlocking {
        val authState = authStateStorage.authStateFlow.first()
        val isNeedToUpdateToken = authState.needsTokenRefresh

        // authState.refreshToken is not null or empty for me!

        suspendCoroutine { continuation ->
            authState.performActionWithFreshTokens(authService) { accessToken, _, exception ->
                exception?.let {
                    Log.e(TAG, "Exception in token process: ", it)
                    continuation.resumeWithException(it)
                } ?: run {
                    if (isNeedToUpdateToken) {
                        runBlocking {
                            authStateStorage.updateAuthState(authState)
                        }
                    }
                    continuation.resume(accessToken!!)
                }
            }
        }
    }
}

我是不是忘了让它正常工作的一些步骤?为什么它会抛出一个异常,但我仍然得到了一个有效的令牌?

EN

回答 1

Stack Overflow用户

发布于 2022-02-22 12:54:08

invalid_grant通常在刷新令牌过期时出现在刷新令牌授予消息中。首先,检查授权服务器是否实际上正在向应用程序返回刷新令牌,并且它的过期时间被配置为大于访问令牌的到期时间。

就我个人而言,我喜欢控制自己的API调用,而不是通过AppAuth来执行这些调用,因此我直接使用performTokenRequest方法。下面是一些可以与之比较的示例代码:

为了进行最好的故障排除,我还建议跟踪HTTP请求以查看刷新令牌授权消息,该消息应该类似于我博客文章的第15步。那里也有一个工作样本,以防万一有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71211348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档