什么是基于令牌的身份验证方案
在基于令牌的身份验证方案中,令牌成为用户的凭据。硬凭证(例如用户名和密码)被交换为必须在每个请求中发送的令牌,然后服务器可以执行身份验证/授权。令牌可以在短时间内有效,可以被撤销,可以携带范围详细信息(令牌可以要求的内容)等。
使用令牌,您必须能够识别针对您的API的用户。因此,为所有经过身份验证的用户使用单个令牌是没有意义的。
解决您的问题
使用JWT后,您可以使用用户名声明所有权。还可以考虑为您的令牌添加一个过期日期(
exp声明)。您不希望您的令牌永远有效,对吗?
对于java-jwt,请使用以下命令:
try { Algorithm algorithm = Algorithm.HMAC256("secret"); Date expirationDate = Date.from(ZonedDateTime.now().plusMinutes(60).toInstant()); String token = JWT.create().withExpiresAt(expirationDate).withClaim("username", username).sign(algorithm);} catch (UnsupportedEncodingException e){ // UTF-8 encoding not supported} catch (JWTCreationException e){ // Invalid signing configuration / Couldn't convert claims}验证令牌时,您将能够获得
username索赔并知道谁为以下对象颁发了令牌:
try { Algorithm algorithm = Algorithm.HMAC256("secret"); JWTVerifier verifier = JWT.require(algorithm).build(); DepredJWT jwt = verifier.verify(token); Claim usernameClaim = jwt.getClaim("username"); String username = usernameClaim.asString();} catch (UnsupportedEncodingException e){ // UTF-8 encoding not supported} catch (JWTVerificationException e){ // Invalid signature/claims}使用JWT处理令牌刷新
仅
接受有效(未过期)令牌进行刷新。客户有责任在
exp索赔中指定的到期日期之前刷新令牌。
为了避免无限期刷新令牌,您可以通过向令牌添加两个声明(声明名称取决于您)来跟踪令牌刷新:
refreshLimit
:指示令牌可以刷新多少次。refreshCount
:指示令牌已刷新多少次。
因此,仅在满足以下条件时才刷新令牌:
- 令牌未过期(
exp >= now
)。 - 令牌已刷新的次数少于令牌可刷新的次数(
refreshCount < refreshLimit
)。
当刷新令牌时:
- 更新到期日期(
exp = now + some-amount-of-time
)。 - 增加令牌已刷新(
refreshCount++
)的次数。
令牌签名并在服务器端验证签名后,客户端就无法篡改令牌的内容。
除了跟踪刷新次数之外,您还可以要求声明 绝对到期日期 。在此日期之前,可以接受任何数量的茶点。
另一种方法涉及发行单独的长期刷新令牌,该令牌用于发行短期JWT令牌。
最佳方法取决于您的要求。
使用JWT处理令牌吊销
如果要撤消令牌,则必须跟踪它们。您不需要将整个令牌存储在服务器端,只需存储令牌标识符(必须是唯一的)和一些元数据(如果需要)。对于令牌标识符,您可以使用UUID。
的
jti权利要求应该被用来存储在令牌本身的令牌标识符。验证令牌时,通过
jti对照服务器端的令牌标识符检查索偿值,确保未撤销令牌。
为了安全起见,请在用户更改密码时撤消该用户的所有令牌。



