You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Retrofit Basic Auth拦截器失效求助(含Dagger Hilt代码)

Retrofit Basic Auth拦截器未生效排查方案

先确认请求头是否真的被添加

建议添加OkHttp日志拦截器,直观查看请求头是否携带了Authorization字段:

  1. 引入Gradle依赖:
    implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'
    
  2. 修改OkHttpClient构建代码,加入日志拦截器:
    @Provides
    @Singleton
    fun provideApi(): Api {
        val loggingInterceptor = HttpLoggingInterceptor().apply {
            level = HttpLoggingInterceptor.Level.HEADERS // 仅查看请求头,也可用BODY看完整请求
        }
        
        val okHttpClient = OkHttpClient.Builder()
            .addInterceptor(loggingInterceptor) // 先加日志拦截器,确保能看到最终请求头
            .addInterceptor { chain ->
                val authenticatedRequest = chain.request().newBuilder()
                    .header("Authorization", Credentials.basic("XXXX", "XXXX"))
                    .build()
                chain.proceed(authenticatedRequest)
            }
            .build()
        
        return Retrofit.Builder()
            .client(okHttpClient)
            .baseUrl(Constants.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(Api::class.java)
    }
    

运行后查看Logcat的OkHttp日志,检查Authorization头是否存在,格式应为Basic [base64编码的用户名:密码]。

检查是否有其他拦截器覆盖请求头

如果项目中存在其他拦截器(比如token刷新拦截器),可能会覆盖Authorization头。确保你的Basic Auth拦截器是最后添加的,或者排查其他拦截器是否修改了同一个请求头。

验证Credentials.basic的编码结果

手动计算用户名:密码的base64编码,和Credentials.basic的返回值对比,确认编码是否正确:

val expected = "Basic " + Base64.encodeToString("用户名:密码".toByteArray(), Base64.NO_WRAP)
Log.d("BasicAuth", "预期值: $expected, 实际值: ${Credentials.basic("用户名", "密码")}")

如果结果不一致,可能是用户名/密码包含特殊字符,需确认服务器要求的编码规则。

确认Hilt注入的Api实例是否正确

检查项目中是否存在其他@Provides方法提供Api实例,或是否有手动创建Api对象的情况,导致带拦截器的实例未被使用。可以在provideApi方法中加日志确认:

@Provides
@Singleton
fun provideApi(): Api {
    Log.d("HiltInject", "正在创建带Basic Auth的Api实例")
    // 其余代码不变
}

运行后查看Logcat是否有这条日志,确认实例是否被正确创建。

替换拦截器实现方式

如果以上排查都没问题,可尝试用OkHttp的Authenticator替代拦截器:

val okHttpClient = OkHttpClient.Builder()
    .authenticator { _, response ->
        val credential = Credentials.basic("XXXX", "XXXX")
        response.request.newBuilder()
            .header("Authorization", credential)
            .build()
    }
    .build()

Authenticator会在请求返回401 Unauthorized时自动添加认证头,适配部分服务器的验证逻辑。

内容的提问来源于stack exchange,提问作者RitchyCZE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:15:33