Jwt Refresh Token 的完整指南

一、什么是Jwt Refresh Token

Json Web Token(JWT)是一种在网络间传输信息的方式,常用于身份验证和授权。使用JWT需要在客户端使用密钥对数据进行签名,然后将令牌发回服务器以进行验证。但是,如果需要长时间访问某些内容,许多身份验证和授权令牌将过期。JWT Refresh Token允许客户端在过期的JWT之前提供一个新的JWT令牌。

JWT Refresh Token是一种标准的身份验证令牌,它允许客户端在过期之前自动重新生成新的令牌,而不需要进行用户重新登录或者授权。

二、Jwt Refresh Token 的工作原理

JWT是一种声明式的身份验证/授权机制,它由三部分组成:头部、载荷和签名。第一部分是头部,用于指定JWT类型和使用的签名算法。第二部分是载荷,包含有关用户的信息和其他元数据。第三部分是签名,用于验证JWT的完整性。这三个部分都是使用Base64进行编码的。

现在,假设在JWT令牌中有一个称为设置Refresh Token的字段,值为true。当该令牌在过期之前发现时,可以使用令牌中包含的“Refresh Token”生成新的JWT令牌并发送给客户端。

以下是JWT和Refresh Token工作的简要流程:

1.使用服务器端密钥和其他信息为JWT生成令牌。

2.返回JWT令牌和Refresh Token

3.客户端记录令牌和Refresh Token,并在每个之间进行快速切换。

4.当JWT令牌过期时,客户端使用Refresh Token请求新的JWT令牌。

5.刷新新的JWT令牌并继续使用。

三、Jwt Refresh Token 的优势

使用JWT Refresh Token有几个优点:

1.颁发长期有效的访问令牌。使用Refresh Token可以将访问令牌的有效期延长到较长的时间。

2.降低服务器负载。使用Refresh Token可以减少对服务器的访问,因为客户端可以在一段时间内自行处理验证和更新令牌。

3.提高安全性。使用Refresh Token可以减少发生中间人攻击的机会,因为JWT令牌有效期非常短,而Refresh Token有效期长。

四、如何实现Jwt Refresh Token

实现JWT Refresh Token需要进行以下步骤:

1.创建初始JWT令牌

const jwt = require('jsonwebtoken');
const jwtKey = 'your_jwt_secret';//jwt密钥
const jwtExpirySeconds = 300; //JWT Token的有效期为5分钟

const userName = 'your_username';//用户名称

const token = jwt.sign({ userName }, jwtKey, {
  algorithm: 'HS256',
  expiresIn: jwtExpirySeconds
});

2.生成Refresh Token

为每个JWT令牌生成一个Refresh Token,用于在令牌到期之前获取新的令牌。

const RefreshToken = require('../models/refresh-token.model');//引入 RefreshToken 模型

const generateRefreshToken = async (userName) => {
  const refreshToken = new RefreshToken({
    userName: userName,
    token: crypto.randomBytes(40).toString('hex'), //生成一个40位的随机Refresh Token
    expires: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) //Refresh Token有效期7天
  });
  await refreshToken.save();
  return refreshToken;
}

3.验证JWT令牌并生成新的JWT令牌

const verify = require('./verify');//引入 JWT 验证方法

const refreshToken = async (oldToken) => {
  const oldDecodedToken = jwt.decode(oldToken);
  const refreshToken = await RefreshToken.findOne({ userName: oldDecodedToken.userName });
  if (!refreshToken) return;//传递的旧Token的refreshToken不存在

  //验证RefreshToken是否过期
  if (refreshToken.expires.valueOf() < Date.now()) {
    await refreshToken.remove();//删除RefreshToken
    return;//refreshToken已过期
  }

  //验证JWT令牌的签名,以确保它没有被改变
  const { algorithm } = jwt.decode(oldToken, { complete: true }).header;
  await verify(oldToken, jwtKey, algorithm);

  const newToken = jwt.sign({ userName: oldDecodedToken.userName }, jwtKey, {
    algorithm: algorithm,//使用相同的算法
    expiresIn: jwtExpirySeconds
  });
  return newToken;
}

4.使用Refresh Token获取新的JWT令牌

const express = require('express');

const router = express.Router();
const RefreshToken = require('../models/refresh-token.model');
const jwtRefreshToken = require('../middleware/jwt-refreshtoken.middleware');
const jwt = require('jsonwebtoken');
const jwtKey = 'your_jwt_secret';//jwt密钥

router.post('/', jwtRefreshToken, async (req, res) => {
  try {
    const oldToken = req.token;//传递的旧的JWT令牌
    const newToken = await refreshToken(oldToken);//生成新的JWT令牌
    if (!newToken) {
      res.status(401).send("Unauthorized");//新的JWT令牌被拒绝
      return;
    }
    res.json({ token: newToken });//发送新的JWT令牌
  } catch (err) {
    res.status(500).send(err);//服务器错误
  }
});

module.exports = router;

五、总结

Jwt Refresh Token 是一种长期有效的身份验证令牌,可以提高客户端的使用体验,降低服务器负载和提高安全性。实现 JWT Refresh Token 具有重要的意义,需要根据具体的业务需求进行定制化开发。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/206089.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-07 17:49
下一篇 2024-12-07 17:49

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • 运维Python和GO应用实践指南

    本文将从多个角度详细阐述运维Python和GO的实际应用,包括监控、管理、自动化、部署、持续集成等方面。 一、监控 运维中的监控是保证系统稳定性的重要手段。Python和GO都有强…

    编程 2025-04-29
  • Python应用程序的全面指南

    Python是一种功能强大而简单易学的编程语言,适用于多种应用场景。本篇文章将从多个方面介绍Python如何应用于开发应用程序。 一、Web应用程序 目前,基于Python的Web…

    编程 2025-04-29
  • Python wordcloud入门指南

    如何在Python中使用wordcloud库生成文字云? 一、安装和导入wordcloud库 在使用wordcloud前,需要保证库已经安装并导入: !pip install wo…

    编程 2025-04-29
  • Python字符转列表指南

    Python是一个极为流行的脚本语言,在数据处理、数据分析、人工智能等领域广泛应用。在很多场景下需要将字符串转换为列表,以便于操作和处理,本篇文章将从多个方面对Python字符转列…

    编程 2025-04-29
  • 打造照片漫画生成器的完整指南

    本文将分享如何使用Python编写一个简单的照片漫画生成器,本文所提到的所有代码和技术都适用于初学者。 一、环境准备 在开始编写代码之前,我们需要准备一些必要的环境。 首先,需要安…

    编程 2025-04-29
  • Python小波分解入门指南

    本文将介绍Python小波分解的概念、基本原理和实现方法,帮助初学者掌握相关技能。 一、小波变换概述 小波分解是一种广泛应用于数字信号处理和图像处理的方法,可以将信号分解成多个具有…

    编程 2025-04-29
  • 如何在Java中拼接OBJ格式的文件并生成完整的图像

    OBJ格式是一种用于表示3D对象的标准格式,通常由一组顶点、面和纹理映射坐标组成。在本文中,我们将讨论如何将多个OBJ文件拼接在一起,生成一个完整的3D模型。 一、读取OBJ文件 …

    编程 2025-04-29
  • Python初学者指南:第一个Python程序安装步骤

    在本篇指南中,我们将通过以下方式来详细讲解第一个Python程序安装步骤: Python的安装和环境配置 在命令行中编写和运行第一个Python程序 使用IDE编写和运行第一个Py…

    编程 2025-04-29
  • Python起笔落笔全能开发指南

    Python起笔落笔是指在编写Python代码时的编写习惯。一个好的起笔落笔习惯可以提高代码的可读性、可维护性和可扩展性,本文将从多个方面进行详细阐述。 一、变量命名 变量命名是起…

    编程 2025-04-29

发表回复

登录后才能评论