【问题标题】:JWT & client and server timeJWT & 客户端和服务器时间
【发布时间】:2022-01-20 19:38:55
【问题描述】:

老实说,我找不到我正在寻找的答案,所以这是我正在努力解决的一个问题,

让我说一件事,如果我要说的完全是狗屁,请告诉我,但我所追求的解决方案也很好

tldr:将客户端日期与 jwt.exp 进行比较以确定 jwt 是否过期是不安全的

让我们看一下典型的 react(client) 和 nodejs(server) 示例,其中 JWT 访问令牌被插入到请求标头中,以便从受保护的 API 路由中获取数据,

  • 客户端向服务器发送登录请求,
  • 服务器在响应中返回访问令牌(例如,有效期为 2 分钟)并创建一个带有刷新令牌的 cookie(例如,有效期为一天) - 两个令牌都是根据服务器时间创建的

现在假设服务器上的时间是下午 3 点,客户端上的时间是下午 1 点 不是因为时区 - 客户端和服务器都在同一个时区,客户端系统时钟无论出于何种原因都只是落后 2 小时

现在,用户已登录,客户端可以将访问令牌添加到请求标头中

3 分钟后,另一个请求会在标头中发送带有访问令牌的请求,以获取一些秘密数据, 请求在客户端被拦截,然后它到达服务器以检查 jwt.exp 以防需要静默 JWT 刷新

所以它运行

如果 Date.now() > JWT.exp

它会返回 false,下午 1:03 不是 > 然后是下午 3:03

如果为 false -> 不需要进行静默令牌刷新

但由于访问令牌仅在 2 分钟内有效,请求显然失败

服务器时间落后于客户端时间的场景,可能会使访问令牌的有效时间比它实际应该有效的时间长

现在,我是个白痴吗?或者我认为检查JWT.exp时应该与服务器时间进行比较是正确的,因为服务器创建了令牌,

感谢阅读

【问题讨论】:

    标签: node.js reactjs jwt


    【解决方案1】:

    我认为一个解决方案是在客户端( react )创建一个拦截器(例如 Axios ),当请求失败时,拦截器可以刷新令牌并重新发送请求。 在这种情况下不导入客户端时间。 示例:

    axio.interceptors.response.use((response: AxiosResponse<any>) => {
        return response;
    }, 
        (error: AxiosError<any>) => {
            if(error.response?.status === 401) {
                // refetch token
                //re-send request
                
                //re send request 
                return refreshToken(store).then(_ => {
                    error.config.headers['Authorization'] = 'Bearer ' + store.state.auth.token;
                    error.config.baseURL = undefined;
                    return Axios.request(error.config);
                });
            }
            return error;
        }
    );
    

    【讨论】:

    • 但这也意味着,如果客户端将其计时在服务器后面,则刷新令牌的请求将在每个请求上运行
    • 否,但令牌内的时间仅在服务器端检查。仅表示服务器中的时间
    • 老实说,没有关注您的最后回复,抱歉回到主题,就像我说的我用谷歌搜索了一个小时,每个教程/等都学会了将 token.jwt 与客户日期进行比较,这太疯狂了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多