当前位置: 首页 > 知识库问答 >
问题:

如何正确处理JWT刷新?

程英资
2023-03-14
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分钟内过期。我知道,在令牌过期后,要么我必须带用户返回登录屏幕,要么刷新令牌。我把这里和这里的建议都看了一遍

但我不明白以下几点。

如何分配并将此令牌发送回用户?当前,当用户登录时,他将获得令牌并将其保存在一个变量中。为了使刷新的令牌工作,我必须再次调用login方法(这样令牌将被发送给用户)还是JWT it self将处理该情况?

我实际上如何使用java-jwt引用?

共有1个答案

燕刚捷
2023-03-14
  1. 如何确定令牌是否必须续订?我想我应该在它过期后再做,但似乎不是这样。如果我要求它现在刷新

您需要在令牌过期之前刷新它。决定您的策略:

>

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

    @GET
    @Path("/jwt/refresh")
    @Produces(MediaType.TEXT_HTML)
    public String refresh(){
        //Build a returns a fresh JWT to client 
    }
    

    如果您在请求期间发出了一个新令牌,您可以在一个特殊的头中返回它,客户端将在处理响应期间读取该头。如果您像上面描述的那样发布了一个“刷新”服务,那么当当前JWT接近到期时,客户端将独立地调用它

    重定向到login方法不是一个好的替代方法,因为您将丢失当前请求

    只要发行一个新的代币

  •  类似资料:
    • 问题内容: Java的I / O类,,,和他们的不同子类中都有一个可抛出的方法。 对于处理此类异常的正确方法是否存在共识? 我经常看到建议,只是默默地忽略它们,但这是错误的,至少在打开用于写的资源的情况下,关闭文件时出现问题可能意味着无法写入/发送未刷新的数据。 另一方面,在阅读资源时,我还不清楚为什么会抛出异常以及如何处理。 那么有什么标准建议吗? 问题答案: 记录下来。 您实际上不能 做任何事

    • 问题内容: 昨天我对一个问题的回答之一是建议我确保我的数据库可以正确处理UTF-8字符。我该如何使用MySQL? 问题答案: 更新: 简短答案-您几乎应该始终使用字符集和排序规则。 更改数据库: 看到: 亚伦对此答案的评论如何使MySQL正确处理UTF-8 utf8_general_ci和utf8_unicode_ci有什么区别 转换指南:https : //dev.mysql.com/doc/r

    • 在 node.js中,通常的做法是将错误消息作为回调函数的第一个参数返回。在纯JS中有许多解决方案(promise,步骤,seq等),但它们似乎都无法与ICS集成。在不损失太多可读性的情况下处理错误的正确解决方案是什么? 例如:

    • 我正在使用单独的后端服务器在客户端移动应用程序中实现JWT,我正在寻找一种最佳方式来使用刷新令牌,而无需过多的服务器调用,同时保持良好的用户体验。 我对实现这样一种机制还很陌生,我对很多事情都感到困惑,所以我真正想要的是一个可靠的概念解决方案,以确保用户访问应用程序,并让他同时无限期登录。 任何更正或建议都将受到欢迎: > 为什么要刷新令牌? 单独使用JWT访问令牌可能会危及用户安全性:如果攻击者

    • 问题内容: 用Java产生和使用外部进程的流(IO)的正确方法是什么?据我所知,由于可能的缓冲区大小有限,因此应在与生成进程输入并行的线程中使用java结束输入流(进程输出)。 但是我不确定我是否最终需要与这些使用者线程进行同步,或者仅等待进程退出以使用方法就足够了,以确保所有进程输出实际上都被消耗了?IE是否有可能,即使进程退出(关闭其输出流),流的Java端仍存在未读数据?实际如何知道该过程何

    • 问题内容: 这是一个困扰我几个小时的问题,我 自己无法找到解决方案…… 我在网上发现了类似的话题,但是我找不到 很好的解释并且尽可能简单的解决方案的完全相同的问题。我也 看过EDT和SwingWorker API文档,但对 我来说太复杂了:( 所以,让我们说清楚。我有一个带有JLabel的简单JFrame,其中 包含我的图像: It’s invoked by this piece of code: