访问令牌与刷新令牌NodeJS

时间:2018-08-06 10:45:08

标签: node.js security authentication oauth jwt

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

目的:我想实施一项用户授权,该授权将在用户闲置两个小时后将其注销(请勿请求该网站或退出浏览器)。

要实现该目标,我尝试遵循以下各项:

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

是否有优化的方法可以达到该目的?

2 个答案:

答案 0 :(得分:1)

首先,您需要了解JWT的原理以及如何在服务器和客户端之间传递JWT以及如何在服务器端与客户端进行秘密通信-这是doc

enter image description here

有效负载可以是任何用户数据-即:仅是usrname或id

基本上,您需要一种服务,该服务在成功身份验证时会生成令牌(当用户使用适当的凭据登录时,即eE: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,则可以在生成令牌时设置令牌的ttl:

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

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

btw:如果我对您的理解正确,那么您的第3点和第4点彼此矛盾。

  
      
  1. 15分钟后,用户令牌访问令牌已过期。
  2.   
  3. 如果用户闲置2个小时,我将从cookie或数据库中删除刷新令牌,否则我将使用刷新令牌来更新访问令牌。
  4.   

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

答案 1 :(得分:1)

  • 根据标准,如果您使用的是JWT Token,则不应保留这些令牌
  • 在创建访问令牌的同时不要创建刷新令牌
  • 访问令牌过期后,用户将发送访问令牌,您的API应生成一个刷新令牌(已过期)并将其发回给用户