【问题标题】:JWT setExpiration for servers time zone Android服务器时区Android的JWT setExpiration
【发布时间】:2017-11-11 20:31:27
【问题描述】:

我正在尝试为我的 JWT Web 令牌设置较短的过期时间。我遇到的问题是客户端是否位于服务器(EST)的不同时区。目前工作代码如下。

Map<String, Object> header = new HashMap<>();
header.put("typ", Header.JWT_TYPE);
long now = Instant.now().getMillis();
String compactJws = Jwts.builder()
        .setHeader(header)
        .claim("email", email)
        .claim("password", password)
        .claim("reg_id", reg_id)
        .claim("deviceId", deviceId)
        .claim("gsf", returnGSF())
        .claim("imei", returnIMEI())
        .claim("serial", Build.SERIAL)
        .claim("version", String.valueOf(version))
        .claim("language", language)
        .setIssuedAt(new Date(now))
        .setExpiration(new Date(now + 60000))
        .signWith(SignatureAlgorithm.HS256, settings.getString("keychain", "password"))
        .compact();

60 秒有足够的余地。我正在用所有不同的日期/格式对象变体拉出我的头发。无论设备位置如何,如何获取美国东部时间的日期对象?

【问题讨论】:

    标签: android date timezone jwt jodatime


    【解决方案1】:

    JWT 时间戳始终基于 UTC,因此时区不是您的问题。

    客户端和服务器时钟很可能不同步。 60 秒对时钟偏差的容忍度不大。其他协议使用更大的差异。例如,Kerberos 允许时钟之间的默认增量为 5 分钟。

    【讨论】:

    • 如果 ttl 不超过几小时,服务器将决定令牌过期。将客户端设备时间更改为东部以外的任何时间以模拟不同的时区会导致令牌立即过期
    • Instant 是基于 UTC 的。 Date 也是如此。 JWT 也是如此。因此,您的链中的任何内容都不应受到客户端时区的影响。您的代码中的其他地方肯定发生了其他事情。
    • 即使是 Jwts setIssuedAt,如果您深入挖掘,只需在该日期对象上调用 getTime,因此它不会在任何地方应用本地时区。
    • 服务器位置的时区是否无关?它只是使用 firebase/JWT-PHP 来解码令牌。我知道事实上所有的 SQL 时间戳都是 EST
    • 我会接受这个答案,因为这是我应该问的问题的答案。 JWT 传递了一个基于 UTC 的 Date 对象
    猜你喜欢
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2013-11-02
    • 2016-05-20
    相关资源
    最近更新 更多