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

Android应用获取JWT Token时Payload缺失2字符的问题求助

Android中获取JWT Token长度与Postman不一致的排查思路

问题描述

在Android应用中通过POST请求调用API获取JWT Token时,Postman测试返回的Token长度为636字符,但应用内仅能获取到634字符的Token,排查发现差异出在Token的Payload部分,少了2个字符。

相关代码

Retrofit接口定义

@Headers({
    "api-key: ....",
    "Content-Type: application/json"
})
@POST("....")
Call<JwtTokenResponseModel> getJwtToken(@Body JwtTokenRequestModel body);

Android客户端调用代码

Call<JwtTokenResponseModel> call = apiService.getJwtToken(requestModel);

call.enqueue(new Callback<JwtTokenResponseModel>() {
    @Override
    public void onResponse(@NonNull Call<JwtTokenResponseModel> call, @NonNull Response<JwtTokenResponseModel> response) {
        if (response.isSuccessful() && response.body() != null) {
            jwtToken = response.body();
            accessToken = jwtToken.getAccessToken();
            Log.i("Info", "onResponse: " + response.code());
            Log.i("Info", "onResponse: Expires In : " + jwtToken.getExpiresIn());
            Log.i("Info", "onResponse: Token Type : " + jwtToken.getTokenType());
            Log.i("Info", "onResponse: Access Token : " + jwtToken.getAccessToken());
            Log.i("Info", "onResponse: Access Token's length : " + jwtToken.getAccessToken().length());
            Toast.makeText(MainActivity.this, "onResponse: Response successful", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(MainActivity.this, "onResponse: Response not successful or body is null", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onFailure(Call<JwtTokenResponseModel> call, Throwable t) {
        Log.e("Error", "onFailure: " + t.getMessage());
    }
});

排查思路

  • 检查响应模型的字段处理:确认JwtTokenResponseModel中的accessToken字段定义为String类型,且没有在getter/setter中做trim()或其他截断操作,避免自动去除首尾字符导致长度缩短。
  • 对比原始响应内容:给Retrofit添加日志拦截器,打印完整的响应体,和Postman返回的原始响应做对比,确认传输过程中是否出现截断。示例拦截器配置:
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(loggingInterceptor)
    .build();

将该OkHttpClient传入Retrofit构建器,即可在Logcat中查看完整的响应数据,对比Postman的响应内容是否一致。

  • 验证JWT编码/解码逻辑:将Postman和应用中获取的Token拆分出Header、Payload、Signature三部分,分别对比Payload的Base64URL编码字符串。部分Base64库会自动去除末尾的填充字符=,但标准JWT应保留这些填充位,检查是否是解码后重新编码时丢失了字符。
  • 确认请求参数一致性:核对Postman和应用发送的请求Header(如api-key)、请求体内容是否完全一致,避免服务器因请求差异返回不同的Token。
  • 检查Log输出的准确性:Logcat对过长字符串可能存在截断或转义问题,建议将Token写入本地文件后再查看实际长度,而不是仅依赖Log的输出结果。

内容的提问来源于stack exchange,提问作者Issam En-Nasyry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 04:41:18