在Android中使用Retrofit2 / Kotlin成功刷新Oauth 2令牌后出现400错误

问题描述

这是我使用kotlin广告翻新2在android应用中刷新令牌的代码

gradle

implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-moshi:retrofit:2.9.0"

Authenticator是:

class OAuthAuthenticator(
        private val refreshTokenService: Repository,private val sessionManager: SessionManager
    ) : Authenticator {
        @Synchronized
        override fun authenticate(route: Route?,response: Response): Request? {
            try {
        //synchronized call to refresh the token
                val refreshTokenResponse =
                    refreshTokenService.refreshJWTToken(sessionManager.getAuthTokens())
                val sessionDataResponseBody = refreshTokenResponse.body()
                if (refreshTokenResponse.isSuccessful && sessionDataResponseBody != null && !sessionDataResponseBody.jwt.isNullOrEmpty()) {
                    sessionManager.jwtToken = sessionDataResponseBody.jwt
                    // retry request with the new tokens (I get 400 error)
                    return response.request()
                        .newBuilder()
                        .addHeader("Authorization","Bearer ${sessionManager.jwtToken}")
                        .build()
                } else {
                    throw HttpException(refreshTokenResponse)
                }
            } catch (throwable: Throwable) {
                when (throwable) {
                    is HttpException -> {
                        onSessionExpiration()
                        return null
                    }
                }
            }
            return null
        }

        private fun onSessionExpiration() {
            sessionManager.clear()
        }
    }

这是Repository类:

object Repository {
    fun refreshJWTToken(authTokens : AuthTokens) = RetrofitBuilder.userApi.getAuthenticationToken(authTokens).execute()
}

这是API

interface UserAPI {
    @Headers("Cache-Control: no-cache")
    @POST(AUTH_TOKENS_URL)
    fun getAuthenticationToken(
        @Header("Accept")  accept : String,@Header("Content-Type")  contentType : String,@Body params: AuthTokens
    ): Call<AuthTokenResponse>
}

retrofit builder

init {
    val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val sessionManager = SessionManager.getInstance(context)
    val httpLoggingInterceptor =
        HttpLoggingInterceptor() 
    httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
    httpClient = OkHttpClient.Builder()
        .addInterceptor(httpLoggingInterceptor)
        .addInterceptor(ConnectivityCheckInterceptor(connectivityManager))
        .addInterceptor(AuthInterceptor(sessionManager))
        .authenticator(OAuth2Authenticator(UserRepository,sessionManager))
        .readTimeout(TIME_OUT,TimeUnit.SECONDS)
        .build()
}

问题: 我可以确认该代码刷新了Auth令牌并成功地将其持久保存。但是在那之后我得到了400错误。关于我在做什么错的任何建议吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)