如何正确处理 JWT 刷新?
How to properly handle a JWT refresh?
我有一个 android 应用程序。它与 Jersey
开发的 REST API
连接。我的 REST 端点由令牌保护。下面是我如何生成它们。
Algorithm algorithm = Algorithm.HMAC256(secret);
String token = JWT.create()
.withClaim("userName","myusername)
.withExpiresAt(expirationDate)
.sign(algorithm);
下面是我验证令牌的方法
public boolean validateTokenHMAC256(String token, String secret) throws UnsupportedEncodingException, JWTVerificationException
{
Algorithm algorithm = Algorithm.HMAC256(secret);
JWTVerifier verifier = JWT.require(algorithm)
.build(); //Reusable verifier instance
DecodedJWT jwt = verifier.verify(token);
Claim usernameClaim = jwt.getClaim("username");
String username = usernameClaim.asString();
System.out.println(username);
return true;
}
在我的 REST API 中,我有一个过滤器,该过滤器检查每个请求以查看令牌是否是原样。下面是代码。
@Secured
@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter{
//private static String authorizationSecret = "ZXW24xGr9Dqf9sq5Dp8ZAn5nSnuZwux2QxdvcH3wQGqYteJ5yMTw5T8DBUJPbySR";
public AuthenticationFilter()
{
System.out.println("test printing");
}
@Override
public void filter(ContainerRequestContext crc) throws IOException
{
String headerString = crc.getHeaderString("Bearer");
System.out.println("bluh: "+headerString);
System.out.println("test printing");
try
{
boolean validateToken = validateToken(headerString, AuthKey.authorizationSecret);
System.out.println("valid");
}
catch(Exception e)
{
System.out.println("invalid");
crc.abortWith(
Response.status(Response.Status.UNAUTHORIZED).build());
}
}
private boolean validateToken(String strToken, String secret) throws UnsupportedEncodingException, JWTVerificationException
{
Token token = new Token();
return token.validateTokenHMAC256(strToken,secret);
}
}
以上代码将在用户登录应用程序时调用。但是令牌将在 60 分钟后过期。我知道在令牌过期后,我必须让用户返回登录屏幕或刷新令牌。我阅读了 and here
中的建议
但是我不明白下面的内容。
如何判断令牌是否需要更新?我以为我应该在它过期后这样做,但似乎并非如此。如果我要求它在 now<exp
中刷新,它会在每个请求中刷新。
如何分配此令牌并将其发回给用户?当前,当用户登录时,他将获得令牌并将其保存在变量中。为了使刷新的令牌起作用,我是否必须再次调用 login
方法(这样令牌将被发送给用户)或者 JWT 会自行处理这种情况?
我如何使用 java-jwt 进行实际引用?
- How can I figure out whether the token has to be renewed? I thought I should do that after it is expired, but seems that is not the case. If I ask it to refresh in now
您需要在令牌过期前刷新它。决定你的政策:
在每个请求中发出新令牌
在当前令牌即将过期时发出一个新令牌。例如10 分钟
让客户端应用在需要时使用您的 api 的 "refresh service" 请求新令牌。例如
@GET
@Path("/jwt/refresh")
@Produces(MediaType.TEXT_HTML)
public String refresh(){
//Build a returns a fresh JWT to client
}
- How can I assign and send this token back to the user?
如果您在请求期间发出新令牌,您可以 return 它在一个特殊的 header 中,客户端将在处理响应期间读取该令牌。如果你像上面描述的那样发布一个"refresh"服务,那么当当前JWT接近过期
时,客户端会独立调用它
重定向到登录方法不是一个好的选择,因为您会丢失当前请求
- How do I actually refresh using java-jwt
只需发行一个新令牌
我有一个 android 应用程序。它与 Jersey
开发的 REST API
连接。我的 REST 端点由令牌保护。下面是我如何生成它们。
Algorithm algorithm = Algorithm.HMAC256(secret);
String token = JWT.create()
.withClaim("userName","myusername)
.withExpiresAt(expirationDate)
.sign(algorithm);
下面是我验证令牌的方法
public boolean validateTokenHMAC256(String token, String secret) throws UnsupportedEncodingException, JWTVerificationException
{
Algorithm algorithm = Algorithm.HMAC256(secret);
JWTVerifier verifier = JWT.require(algorithm)
.build(); //Reusable verifier instance
DecodedJWT jwt = verifier.verify(token);
Claim usernameClaim = jwt.getClaim("username");
String username = usernameClaim.asString();
System.out.println(username);
return true;
}
在我的 REST API 中,我有一个过滤器,该过滤器检查每个请求以查看令牌是否是原样。下面是代码。
@Secured
@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter{
//private static String authorizationSecret = "ZXW24xGr9Dqf9sq5Dp8ZAn5nSnuZwux2QxdvcH3wQGqYteJ5yMTw5T8DBUJPbySR";
public AuthenticationFilter()
{
System.out.println("test printing");
}
@Override
public void filter(ContainerRequestContext crc) throws IOException
{
String headerString = crc.getHeaderString("Bearer");
System.out.println("bluh: "+headerString);
System.out.println("test printing");
try
{
boolean validateToken = validateToken(headerString, AuthKey.authorizationSecret);
System.out.println("valid");
}
catch(Exception e)
{
System.out.println("invalid");
crc.abortWith(
Response.status(Response.Status.UNAUTHORIZED).build());
}
}
private boolean validateToken(String strToken, String secret) throws UnsupportedEncodingException, JWTVerificationException
{
Token token = new Token();
return token.validateTokenHMAC256(strToken,secret);
}
}
以上代码将在用户登录应用程序时调用。但是令牌将在 60 分钟后过期。我知道在令牌过期后,我必须让用户返回登录屏幕或刷新令牌。我阅读了
但是我不明白下面的内容。
如何判断令牌是否需要更新?我以为我应该在它过期后这样做,但似乎并非如此。如果我要求它在
now<exp
中刷新,它会在每个请求中刷新。如何分配此令牌并将其发回给用户?当前,当用户登录时,他将获得令牌并将其保存在变量中。为了使刷新的令牌起作用,我是否必须再次调用
login
方法(这样令牌将被发送给用户)或者 JWT 会自行处理这种情况?我如何使用 java-jwt 进行实际引用?
- How can I figure out whether the token has to be renewed? I thought I should do that after it is expired, but seems that is not the case. If I ask it to refresh in now
您需要在令牌过期前刷新它。决定你的政策:
在每个请求中发出新令牌
在当前令牌即将过期时发出一个新令牌。例如10 分钟
让客户端应用在需要时使用您的 api 的 "refresh service" 请求新令牌。例如
@GET
@Path("/jwt/refresh")
@Produces(MediaType.TEXT_HTML)
public String refresh(){
//Build a returns a fresh JWT to client
}
- How can I assign and send this token back to the user?
如果您在请求期间发出新令牌,您可以 return 它在一个特殊的 header 中,客户端将在处理响应期间读取该令牌。如果你像上面描述的那样发布一个"refresh"服务,那么当当前JWT接近过期
时,客户端会独立调用它重定向到登录方法不是一个好的选择,因为您会丢失当前请求
- How do I actually refresh using java-jwt
只需发行一个新令牌