Android Kotlin集成API遇Missing Authentication Token问题求助
Android Kotlin Retrofit集成API时提示"Missing Authentication Token",API Key未正确携带
问题根源
你的代码存在重复设置API Key请求头的冲突:OkHttp拦截器已经全局添加了X-API-KEY,但Retrofit接口方法又通过@Header参数要求传入该值。如果调用时传入的apiKey为空(比如BuildConfig.API_KEY未正确配置),会直接覆盖拦截器的设置,导致请求头里的API Key丢失,触发认证错误。
修复方案
方案1:移除接口方法中的@Header参数(推荐)
既然已经通过拦截器全局注入API Key,无需在接口方法里重复定义:
修改SightHoundApiService接口:
interface SightHoundApiService { @POST(apiURL) @Headers("Content-Type: application/json") fun annotateImageLicensePlate( @Body requestBody: LicensePlateRequest ): Call<LicensePlateResponse> }
修改调用逻辑:
fun annotateImageLicensePlate(requestBody: LicensePlateRequest): Call<LicensePlateResponse> { return RetrofitClient.instance.annotateImageLicensePlate(requestBody) } // 调用时无需传入apiKey val request = annotateImageLicensePlate(requestBody)
方案2:保留接口@Header参数,移除拦截器中的API Key设置
如果需要针对不同请求传递不同API Key,就去掉拦截器里的X-API-KEY配置:
修改RetrofitClient:
object RetrofitClient { val instance: SightHoundApiService by lazy { val okHttpClient = OkHttpClient.Builder() .addInterceptor { chain -> val request = chain.request() val newRequest = request.newBuilder() .header("Content-Type", "application/json") // 移除这行API Key设置 .build() chain.proceed(newRequest) } .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.HEADERS)) .build() Retrofit.Builder() .baseUrl(Constants.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(okHttpClient) .build() .create(SightHoundApiService::class.java) } }
关键检查点
验证BuildConfig.API_KEY的有效性:
打开BuildConfig文件(Android Studio双击Shift搜索即可找到),确认API_KEY的值是否正确。如果是在gradle中配置的,确保格式正确:// app/build.gradle的defaultConfig块内 buildConfigField("String", "API_KEY", "\"你的实际API密钥\"")注意外层引号要转义,否则会被识别为变量而非字符串。
查看完整请求头日志:
你的HttpLoggingInterceptor已设置为Level.HEADERS,在Logcat中搜索OkHttp,可以看到实际发送的请求头。检查X-API-KEY是否存在、值是否正确——如果日志里没有这个字段,说明设置未生效或传入的值为空被Retrofit忽略。
内容的提问来源于stack exchange,提问作者migapines
相关产品推荐
相关产品推荐

