【问题标题】:How to stop Okhttp Authenticator from being called multiple times?如何阻止 Okhttp Authenticator 被多次调用?
【发布时间】:2019-09-02 01:47:32
【问题描述】:

我有一个这样的身份验证器

@Singleton
class TokenAutheticator @Inject constructor(private val tokenHolder: Lazy<TokenHolder>,private val tokenInterceptor: TokenInterceptor):Authenticator {
    override fun authenticate(route: Route?, response: Response): Request? {

        val resp = tokenHolder.get().tokenService.relogin(tokenInterceptor.token).execute()
        println("### res "+resp.code())
        if (resp.code()==200) {
            val body = tokenHolder.get().tokenService.relogin(tokenInterceptor.token).execute()?.body()

            val newToken = body?.token
            println("########## authenticator ########## ")
            val url = route?.address()?.url()?.newBuilder()?.addQueryParameter("token", newToken)?.build()


            return response.request().newBuilder().url(url).build()
        }else{
            return null
        }
    }


}

resp.code != 200 Authenticator 被多次调用。 我像这样将它插入 Okhttp

@Provides
@Singleton
fun provideOkhttp(tokenInterceptor: TokenInterceptor, tokenAutheticator: TokenAutheticator): OkHttpClient {

    val logging = HttpLoggingInterceptor()
    logging.setLevel(HttpLoggingInterceptor.Level.BODY)
    val client = OkHttpClient.Builder()

            .authenticator(tokenAutheticator)
            .addInterceptor(logging)
            .addInterceptor(tokenInterceptor)
            .build()

    return client
}

所以我想要做的是让 Authenticator 只尝试一次,如果它能够获得一个新的令牌,那么从现在开始使用新的令牌,如果它不能获得一个新的令牌然后退出。但是 Authenticator 被多次调用,并且 API 响应太多尝试。任何帮助表示赞赏。谢谢

【问题讨论】:

  • 我也遇到了同样的问题。你有什么解决办法吗

标签: android kotlin retrofit okhttp okhttp3


【解决方案1】:

只有当您返回null 时,Authenticator 才会停止被调用(停止重试身份验证)。

由于你总是返回一些东西,当响应码是 200 时,它会被调用几次。幸运的是,据我了解,Authenticator 检测到了您的无限循环,并最终摆脱了它。

基本上,您应该使用Authenticator 来响应 401(和类似的)响应代码,并且只在这种情况下添加授权标头。

【讨论】:

    猜你喜欢
    • 2015-11-28
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2020-01-12
    相关资源
    最近更新 更多