我的问题与用户问这问题的问题基本相同:安卓的AppAuth库缺乏适当的文档。
当当前访问令牌过期时,我的问题就会发生,这会阻止我的应用程序内部的API通信。为了防止这种情况,我强迫TokenInterceptor从getAccessToken方法(它使用AppAuth的performActionWithFreshTokens方法)获取每个请求上的令牌,据说该方法执行令牌刷新请求(我查看了它的代码)。但是,它总是为我抛出一个带有错误invalid_grant的invalid_grant。
这是我的应用程序第一次崩溃,但工作良好后,重新启动。所以令牌会刷新,不是吗?
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!!)
}
}
}
}
}我是不是忘了让它正常工作的一些步骤?为什么它会抛出一个异常,但我仍然得到了一个有效的令牌?
发布于 2022-02-22 12:54:08
invalid_grant通常在刷新令牌过期时出现在刷新令牌授予消息中。首先,检查授权服务器是否实际上正在向应用程序返回刷新令牌,并且它的过期时间被配置为大于访问令牌的到期时间。
就我个人而言,我喜欢控制自己的API调用,而不是通过AppAuth来执行这些调用,因此我直接使用performTokenRequest方法。下面是一些可以与之比较的示例代码:
为了进行最好的故障排除,我还建议跟踪HTTP请求以查看刷新令牌授权消息,该消息应该类似于我博客文章的第15步。那里也有一个工作样本,以防万一有用。
https://stackoverflow.com/questions/71211348
复制相似问题