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

Android端Token未过期但后端Java验证失败问题排查

Android与后端Java验证Google登录Token过期状态不一致问题

问题背景

后端Java代码验证Android端传入的Google登录Token时返回false(验证失败),但Android端判断Token未过期,两端逻辑出现分歧。

后端验证代码

GoogleIdTokenVerifier verifier =
        new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), new GsonFactory())
                .setAudience(Collections.singletonList(googleClientAppID))
                .build();
...
GoogleIdToken idToken = verifier.verify(googleIdToken);
if (idToken == null) {
    return false;
}
...

Android端过期判断代码

GoogleSignInAccount glAccount = 
GoogleSignIn.getLastSignedInAccount(getApplicationContext());
if (glAccount != null && glAccount.isExpired()) {
    // 过期处理逻辑
    glAccount = null;
}

该代码未进入if分支,说明Android端认为Token未过期。

两端过期判断逻辑对比

Android端isExpired()实现

return zaf.currentTimeMillis() / 1000L >= this.zal - 300L;

逻辑说明:只有当当前时间(秒)大于等于「Token过期时间(秒)- 300秒(5分钟)」时,才判定为过期。也就是说,Token在过期前5分钟内,Android端仍会认为它有效。

后端verifyExpirationTime()实现(返回false表示过期)

return currentTimeMillis <= (this.getPayload().getExpirationTimeSeconds() + acceptableTimeSkewSeconds) * 1000L;

逻辑说明:只有当当前时间(毫秒)小于等于「Token过期时间(秒)+ 允许的时间偏移秒数」转换为毫秒时,才判定为未过期。默认情况下,GoogleIdTokenVerifier的acceptableTimeSkewSeconds为0秒。

问题原因及解决方法

1. 时间偏移量配置不一致

这是最可能的原因:Android端给了5分钟的过期缓冲,而后端默认没有设置时间偏移,导致后端在Token过期瞬间就判定为无效,但Android端还认为它有效。

解决方法:在后端构建GoogleIdTokenVerifier时,显式设置与Android端一致的时间偏移量:

GoogleIdTokenVerifier verifier =
        new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), new GsonFactory())
                .setAudience(Collections.singletonList(googleClientAppID))
                .setAcceptableTimeSkewSeconds(300) // 匹配Android端的5分钟缓冲
                .build();

2. 确认Token的实际过期状态

手动解析Token的payload,查看exp字段(过期时间戳,单位秒),对比后端当前时间(转换为秒):

  • 如果后端当前时间 > exp + 300:说明Token确实已过Android端的缓冲期,此时需要让Android端调用GoogleSignInClient.silentSignIn()重新获取有效的ID Token。
  • 如果后端当前时间 <= exp + 300:则验证失败可能是其他原因,比如签名无效、Audience不匹配等。

3. 检查Token类型是否正确

确保Android端传给后端的是Google Sign-In的ID Token,而非Access Token。两者的过期时间和用途不同,Access Token的有效期通常更短,且无法用于后端的身份验证。

4. 验证Token的核心字段

解析Token payload,检查以下字段是否符合要求:

  • aud:必须与后端设置的googleClientAppID完全一致(注意是Android端的Client ID,不是后端的)。
  • iss:必须是accounts.google.com或https://accounts.google.com。
  • exp:确认过期时间戳是否正确转换(注意是秒,后端判断时要转换为毫秒)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:37:06