我有一个网站和一个Java服务器进行通信。当网站上的用户使用适当的凭据登录时,服务器将生成JWT并将其发送给客户端。令牌的创建过程如下:
Calendar cal = Calendar.getInstance();
JwtToken token = new JwtToken(JWT.create()
.withIssuer(user.getEmail())
.withClaim("username", user.getUsername())
.withIssuedAt(cal.getTime())
.withExpiresAt(addHours(2))
.sign(algorithm));
其中的addHours()方法仅占用当前时间,并向其添加n小时。
,并且sign()中使用的算法是:
Algorithm algorithm = Algorithm.HMAC256(secret);
秘密由以下人员生成:
Random random = new Random();
byte[] randomBytes = new byte[32];
random.nextBytes(randomBytes);
return Base64.getUrlEncoder().encodeToString(randomBytes);
我认为应该创建256个随机位并对其进行base64编码。 (我读过某个地方,秘密应该是256个base64编码的位,我不确定这是否正确,请告诉我)
一切正常,并给了我一个我认为是正确的令牌(https://jwt.io网站说它也是有效的)。令牌的示例:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqdXN0aW4yNTA4OTlAaG90bWFpbC5jb20iLCJleHAiOjE1NDQ4MjUzOTIsImlhdCI6MTU0NDgxODE5MiwidXNlcm5hbWUiOiJKdXN0aW4ifQ.C2Tft5oy8fleYNz4oVCw6S28VGU7YzguA428sZ59QUM
这样令牌就被发送回用户,并以cookie的形式存储。当用户尝试访问需要身份验证的内容时,他们会在“ Authorization”标头中发送带有令牌的请求。
在服务器大小上,我从标头接收到该令牌并尝试对其进行验证。这是我遇到问题的地方。我目前正在执行以下操作:
DecodedJWT decoded = JWT.decode(token);
JWTVerifier = JWT.require(algorithm).withIssuer(decoded.getIssuer()).build();
verifier.verify(token);
这给了我以下例外:
com.auth0.jwt.exceptions.SignatureVerificationException: The Token's Signature resulted invalid when verified using the Algorithm: HmacSHA256
任何帮助将不胜感激