Retrofit Basic Auth拦截器失效求助(含Dagger Hilt代码)
Retrofit Basic Auth拦截器未生效排查方案
先确认请求头是否真的被添加
建议添加OkHttp日志拦截器,直观查看请求头是否携带了Authorization字段:
- 引入Gradle依赖:
implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0' - 修改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
相关产品推荐
相关产品推荐

