Java 如何正确处理JWT刷新?

Java 如何正确处理JWT刷新?,java,rest,jersey,jwt,auth0,Java,Rest,Jersey,Jwt,Auth0,我有一个android应用程序。它与使用Jersey开发的restapi相连接。我的剩余端点用代币固定。下面是我如何生成它们的 Algorithm algorithm = Algorithm.HMAC256(secret); String token = JWT.create() .withClaim("userName","myusername) .withExpiresAt(expirationDate) .sign(algorithm); 下面是我如何验证令牌的

我有一个android应用程序。它与使用
Jersey
开发的
restapi
相连接。我的剩余端点用代币固定。下面是我如何生成它们的

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;
    }
在我的RESTAPI中,我有一个过滤器,该过滤器检查每个请求,以查看令牌是否与原来一样。下面是代码

@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分钟后过期。我知道令牌过期后,我必须将用户带回登录屏幕或刷新令牌。我仔细阅读了这些建议

但我不明白以下几点

  • 如何确定是否必须续订令牌?我想我应该在它过期后再做,但似乎不是这样。如果我要求它现在刷新
    
    
  • 如何确定是否必须续订令牌?我想我应该在它过期后再做,但似乎不是这样。如果我要求它现在刷新 您需要在令牌过期之前刷新它。决定你的政策:

    • 在每个请求中发出一个新令牌

    • 当当前令牌即将过期时发出新令牌。e、 g.10分钟

    • 让客户端应用程序在需要时使用api的“刷新服务”请求新令牌。比如说


  • 如何分配此令牌并将其发送回用户
  • 如果您在请求期间发出一个新的令牌,您可以在一个特殊的头中返回它,客户端将在响应处理期间读取该头。如果您发布了如上所述的“刷新”服务,那么当当前JWT即将到期时,客户端将独立调用它

    重定向到登录方法不是一个好的选择,因为您将丢失当前请求

  • 如何使用JavaJWT进行实际刷新

  • 只需发行一个新代币

    谢谢
    如果您建立了刷新服务,那么客户端将独立调用。
    -我不清楚,请解释一下。所以基本上在refresh()方法中,我要做的是;1.检查令牌是否已过期。2.如果未过期,请调用问题中的第一组代码,它能够生成令牌。我说得对吗
    如果您发布如上所述的“刷新”服务,则当当前JWT即将到期时,客户端将独立调用该服务
    ——这意味着客户端应跟踪其JWT是否即将到期?我的客户端是android应用程序,所以android应用程序应该检查令牌是否过期,不是吗?是的,就是这样。要检查过期,android应用程序可以检查令牌负载中的
    exp
    声明
    @GET
    @Path("/jwt/refresh")
    @Produces(MediaType.TEXT_HTML)
    public String refresh(){
        //Build a returns a fresh JWT to client 
    }