亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 UTC 中使用過期日期時 JWT 過期不起作用

在 UTC 中使用過期日期時 JWT 過期不起作用

慕田峪9158850 2022-11-30 16:07:53
我正在使用jjwtjwt 令牌創建。使用本地系統時間設置到期日期時一切正常,即日期 expDate = new Date(new Date().getTime() + 180000); //java.util.日期但我嘗試使用 UTC 格式日期時間并使用相同的 3 分鐘到期日期簽署 jwt 令牌?,F在它正在拋出ExpiredJwtException,盡管我在創建令牌后立即進行驗證。我正在使用 SimpleDateFormat 將時區設置為 utc。這是我在 java 中使用 jjwt 創建令牌的代碼:    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    Date expDate, issDate;    try {        expDate = (Date) simpleDateFormat.parse(sdf.format(new Date().getTime() + 180000));        issDate = (Date) simpleDateFormat.parse(sdf.format(new Date().getTime()));        JwtBuilder builder = Jwts.builder()                .setExpiration(expDate)                .setIssuedAt(issDate)                .setId(id)                .signWith(signingKey, signatureAlgorithm);        jwtToken = builder.compact();    } catch (ParseException ex) {    }令牌已成功創建。我也可以在線驗證內容。expDate 比 issDate 早 3 分鐘。我還在通過傳遞創建的令牌創建令牌后立即調用驗證令牌的方法。我的驗證方法有:    try {        Jwts.parser().setSigningKey(signingKey).parseClaimsJws(token);        log.info("jwt verification success");    } catch (ExpiredJwtException exJwt) {        log.info("expired jwt : \n{}", exJwt.getMessage());    } catch (JwtException e) {        log.info("tampered jwt");    }但我越來越ExpiredJwtException。錯誤是expired jwt :JWT 在 2019-05-17T01:24:48Z 過期。當前時間:2019-05-17T07:06:48Z,相差20520836毫秒。允許的時鐘偏差:0 毫秒。從我的日志來看,此時我的token中的簽發日期和到期日期是:issued date is: 2019-05-17T07:06:48.000+0545expiry date is: 2019-05-17T07:09:48.000+0545這是怎么回事?謝謝你的幫助。
查看完整描述

1 回答

?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

這里不需要SimpleDateFormat,as表示自Unix EpochDate以來的毫秒數,即 1970 年 1 月 1 日午夜(UTC)。

然而,可能導致混淆的是方法toString()因為它在生成表示該值的字符串時應用 JVM 的默認時區。

由于您擔心 UTC,讓我提醒您注意協調世界時 (UTC) 實際上是什么:它是一個時間標準(而不是時區),它由高精度原子鐘和地球自轉決定。

UTC 時間標準經過多次調整,直到 1972 年引入閏秒以使 UTC 與地球自轉保持一致,地球自轉并不完全均勻,而且不如原子鐘精確。隨著地球自轉速度的減慢,我們不得不時不時地在各處插入閏秒:

http://img1.sycdn.imooc.com//63870f9f00010d1405730288.jpg

雖然 的內部值Date旨在反映 UTC,但由于那些閏秒,它可能不會完全這樣做。

Java 8 和日期和時間的新 API

即使Date在涉及 UTC 時適合您的需求,您也應該避免使用它?,F在是遺留類。

Java 8為基于 ISO 日歷系統的日期、時間、瞬間和持續時間引入了新的 API 。最接近的等價物DateInstant代表時間戳,UTC 時間線上的時刻。

要以 UTC 格式捕獲當前時刻,您可以使用以下命令:

Instant.now();              // Capture the current moment in UTC

您可以使用以下內容來獲取表示此類值的字符串:

Instant.now().toString();   // 2019-05-17T12:50:40.474Z

此字符串根據ISO 8601進行格式化,其中Z指示給定時間為 UTC。

與 JJWT 的互操作性

對于尚不支持類型的JJWT 的互操作性java.time,您可以創建Datefrom的實例Instant

Date.from(Instant.now());   // Convert from modern class to legacy class

這是一個演示如何發布和驗證令牌的測試:

@Test

public void shouldMatchIssuedAtAndExpiration() {


    Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);


    Instant issuedAt = Instant.now().truncatedTo(ChronoUnit.SECONDS);

    Instant expiration = issuedAt.plus(3, ChronoUnit.MINUTES);


    log.info("Issued at: {}", issuedAt);

    log.info("Expires at: {}", expiration);


    String jws = Jwts.builder()

            .setIssuedAt(Date.from(issuedAt))

            .setExpiration(Date.from(expiration))

            .signWith(key)

            .compact();


    Claims claims = Jwts.parser()

            .setSigningKey(key)

            .parseClaimsJws(jws)

            .getBody();


    assertThat(claims.getIssuedAt().toInstant(), is(issuedAt));

    assertThat(claims.getExpiration().toInstant(), is(expiration));

}

對于上面的示例,我使用了 JJWT 0.10.5 以及文檔中列出的依賴項。如果您需要,上面的代碼是用以下import語句編寫的:


import io.jsonwebtoken.Claims;

import io.jsonwebtoken.Jwts;

import io.jsonwebtoken.SignatureAlgorithm;

import io.jsonwebtoken.security.Keys;

import lombok.extern.slf4j.Slf4j;

import org.junit.Test;


import java.security.Key;

import java.time.Instant;

import java.time.ZoneOffset;

import java.time.temporal.ChronoUnit;

import java.util.Date;


import static org.hamcrest.CoreMatchers.is;

import static org.junit.Assert.assertThat;


查看完整回答
反對 回復 2022-11-30
  • 1 回答
  • 0 關注
  • 257 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號