【问题标题】:Access Token vs Refresh Token NodeJS访问令牌与刷新令牌 NodeJS
【发布时间】:2019-01-13 07:22:46
【问题描述】:

我是JWT 的新手,它代表Json Web Token。我对它的几个术语感到困惑:访问令牌和刷新令牌。

目的:我想实现用户授权,在闲置两小时后将用户注销(不要请求站点或退出浏览器)。

为了达到这个目标,我正在尝试遵循以下项目:

  1. 用户在网站注册/登录后,我创建Access TokenRefresh Token
  2. 将刷新令牌保存在 DB 或 cookie 中。
  3. 15 分钟后用户令牌访问令牌过期。
  4. 如果用户空闲 2 小时,我会从 cookie 或 DB 中删除刷新令牌,否则我会使用刷新令牌更新访问令牌。

有没有优化的方法来达到这个目的?

【问题讨论】:

    标签: node.js security authentication oauth jwt


    【解决方案1】:

    首先,您需要了解 JWT 的原理以及它们如何在服务器和客户端之间传递,以及如何在服务器端匹配秘密 - 这里是 doc

    有效负载可以是任意用户数据 - 即:只是一个 usrname 或 id

    基本上,您需要一个服务,该服务在成功验证时生成令牌(当用户使用正确的凭据登录时,即:usr & pwd)并创建一个带有令牌的附加标头,以用于对服务器的进一步请求。

     // INFO: Function to create headers, add token, to be used in HTTP requests
      createAuthenticationHeaders() {
        this.loadToken(); // INFO: Get token so it can be attached to headers
        // INFO: Headers configuration options
        this.options = new RequestOptions({
          headers: new Headers({
            'Content-Type': 'application/json', // INFO: Format set to JSON
            'authorization': this.authToken // INFO: Attach token
          })
        });
      }
    
      // INFO: Function to get token from client local storage
      loadToken() {
        this.authToken = localStorage.getItem('token');; // Get token and asssign to 
    variable to be used elsewhere
      }
    

    以及一些存储用户状态的功能,即:

     // INFO: Function to store user's data in client local storage
     storeUserData(token, user) {
       localStorage.setItem('token', token); // INFO: Set token in local storage
       localStorage.setItem('user', JSON.stringify(user)); // INFO: Set user in local 
      storage as string
          this.authToken = token; // INFO: Assign token to be used elsewhere
          this.user = user; // INFO: Set user to be used elsewhere
        }
    

    还有一个注销功能来销毁本地存储中的令牌,即:

     // INFO: Function for logging out
     logout() {
    this.authToken = null; // INFO: Set token to null
       this.user = null; // INFO: Set user to null
       localStorage.clear(); // INFO: Clear local storage
     }
    

    如果你使用npm的jsonwebtoken,你可以在生成token的时候设置它的ttl:

    const token = jwt.sign({ id: idDB }, "secret", { expiresIn: '24h' }); 
    

    或任何你想要的 ttl,字符串“secret”指的是与服务器匹配的秘密。

    顺便说一句:如果我理解正确,您的第 3 点和第 4 点相互矛盾..

    1. 用户令牌在 15 分钟后访问令牌过期。
    2. 如果用户空闲 2 小时,我会从 cookie 或 DB 中删除刷新令牌,否则我会使用刷新令牌更新访问令牌。

    如果你正确实现了数字 3 的逻辑,它无论如何都会在 15 分钟内被销毁

    【讨论】:

    • 我不明白您的代码在闲置两个小时后如何注销用户。我的意思是如果用户在两个小时内没有向服务器发送任何请求,那么在这段时间之后,每当用户发送请求时,它都应该被注销。我认为expiresIn 会有所不同,因为它只考虑生成令牌的时间。 注意:某些浏览器不支持 localStorage。
    • 生成令牌的 ttl 会为您执行此操作,在我的情况下为 24 小时 - 但您也可以在几秒钟内*分钟内声明它:const token = jwt.sign({ id : idDB }, "secret", { expiresIn:60*15 });
    • 你为什么要这样做?过期后,您使用路由器将用户重定向到您的登录页面,并且在新的成功登录时,将生成并传递一个新令牌 - 您不重复使用旧令牌,而是生成一个新令牌..
    • 根据您要实现的内容,您只需要三个函数:jwt.sign 生成令牌,jwt.verify 匹配一个令牌和 this.authToken = null & localStorage.clear(); 销毁它..
    • 您可以使用 cookie、浏览器本地存储或例如使用数据库并在每次请求时检索它、匹配或更改 - 但我不建议这样做 - 这是一个 link你应该阅读..
    猜你喜欢
    • 1970-01-01
    • 2020-03-10
    • 2019-06-29
    • 2020-07-12
    • 2020-01-09
    • 2021-08-23
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多