如何在令牌验证器和注销用户中显示错误消息



我想刷新令牌并再次发送请求。我可以提出请求,如果它是成功的,没有问题,但如果刷新令牌响应失败,我想显示错误消息和转发用户登录屏幕。我也没有上下文TokenAuthenticator类,这是不可能的,因为它提供在我的Hilt NetworkModule。

我已经尝试在会话中创建一个mutableelvedata和postvalue true在下面的类,但当我观察它在BaseActivity,它去无限循环,每次触发后一次postvalue。

我该如何解决这个问题?

class TokenAuthenticator(
val preferenceHelperImp: PreferenceHelperImp,
private val tokenApi: RefreshTokenApi,
) : Authenticator{
override fun authenticate(route: Route?, response: Response): Request? {
GlobalScope.launch {
getUpdatedRefreshToken(RefreshTokenRequest(preferenceHelperImp.getRefreshToken())
).collect {
when (it) {
is State.Success -> {
preferenceHelperImp.setCurrentUserLoggedInMode(Constants.App.LoggedInMode.LOGGED_IN_MODE_SERVER)
preferenceHelperImp.setAccessToken(it.data.body()?.payload?.accessToken)
preferenceHelperImp.setRefreshToken(it.data.body()?.payload?.refreshToken)
preferenceHelperImp.setUserInfo(Gson().toJson(TokenInfo.initFromToken(
it.data.body()?.payload?.accessToken!!)))
Session.current.userInfo =
Gson().fromJson(preferenceHelperImp.getUserInfo(),
TokenInfo::class.java)
response.request.newBuilder()
.header("Authorization", it.data.body()?.payload?.accessToken!!)
.build()
}
is State.Fail -> {
Session.current.isRefreshTokenFail.postValue(true)
}
is State.Error -> {
Session.current.isRefreshTokenFail.postValue(true)
}
}
}
}
return null
}
private fun getUpdatedRefreshToken(refreshTokenRequest: RefreshTokenRequest): Flow<State<LoginResponse>> {
return object :
NetworkBoundRepository<LoginResponse>() {
override suspend fun fetchFromRemote(): retrofit2.Response<LoginResponse> =
tokenApi.getRefreshToken(refreshTokenRequest)
}.asFlow()
}
}

你可以试试typealias吗?

typealias OnAuthSuccess = () -> Unit
typealias OnAuthFailure = () -> Unit
class TokenAuthenticator (){...
override fun authenticate(onAuthSuccess: OnAuthSuccess,onAuthFailure: OnAuthFailure, route: Route?, response: Response): Request? {
when (it) {
is State.Success -> {
onAuthSuccess.invoke()
}
is State.Fail -> {
onAuthFailure.invoke()
}
}

最新更新