首页 > 解决方案 > 访问令牌与刷新令牌 NodeJS

问题描述

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

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

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

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

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

标签: node.jssecurityauthenticationoauthjwt

解决方案


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

在此处输入图像描述

有效负载可以是任意用户数据 - 即:只是一个 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
  }

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

 // 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 的时候设置 token 的 ttl:

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

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

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

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

在第 4 种情况下,如果您正确实施第 3 号的逻辑,它将在 15 分钟内被销毁


推荐阅读