android 安卓应用isExpired false,后台校验显示过期时间

46qrfjad  于 2023-04-10  发布在  Android
关注(0)|答案(1)|浏览(100)

我在后端(java)上验证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;
        }

...

我得到false,意味着验证失败。
同时,在Android应用程序中,以下代码不会输入if语句:

GoogleSignInAccount glAccount = 
        GoogleSignIn.getLastSignedInAccount(getApplicationContext());
        if (glAccount != null && glAccount.isExpired()) {
            //com.google.api.auth2.getAuthInstance().currentUser.get().reloadAuthResponse();
            glAccount = null;
        }

因此令牌未过期。
在检查代码和它在Android应用程序中的作用后,检查是:

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

这是可以的,没有过期,不管那些ZAF/ZAL值意味着什么。
现在后端检查是这样的(显示返回false的代码,使其过期):

this.verifyExpirationTime(currentTimeMillis, acceptableTimeSkewSeconds)

verifyExpirationTime执行以下操作:

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

现在我想知道为什么它们不同?看起来令牌的有效负载包含以秒为单位的过期时间,表明令牌已过期。我做错了什么?
我已经检查了后端服务器上的时间,它的确定(正确)。

wqlqzqxt

wqlqzqxt1#

原来这是一个时间的问题,在Android模拟器上设置不正确。修复时间来纠正一个删除了这个问题。

相关问题