微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在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 举报,一经查实,本站将立刻删除。