哈喽大家好,我是咸鱼。

最近写的一个 Python 项目用到了 jwcrypto 这个库,这个库是专门用来处理 JWT 的,JWT 全称是 JSON Web Token ,JSON 格式的 Token。

今天就来简单入门一下 JWT。

官方介绍:https://jwt.io/introduction

先聊聊 Token

Token 的意思是令牌,通常用于身份验证。

例如,当客户端首次登录服务器时,服务器会生成一个 Token 并返回给客户端。此后,客户端只需在请求数据时带上这个 Token,无需再次提供用户名和密码。

为什么要有 Token ?

我们知道 HTTP 请求是无状态的,也就是说服务器无法识别每个请求的发起者(例如,我登录淘宝网后刷新页面,会要求我重新输入用户名和密码进行登录)。

为了解决这个问题,出现了一种解决方案:即服务器为每个客户端分配一个 session。当客户端发起请求时带上这个 session,服务器就能识别请求的发起者。

然而,这种方法很快暴露了一些弊端。首先是开销问题。服务器需要保存所有客户端的 session,如果访问的客户端数量增加,服务器将需要保存成千上万个 session,带来巨大的存储开销。

其次是跨域问题。例如,在集群架构中有两台服务器 A 和 B。如果咸鱼第一次请求到了 A 服务器,A 服务器保存了咸鱼的 session,但如果下一次请求被分配到 B 服务器,B 服务器上没有咸鱼的 session,该怎么办?

一种解决方案是使用 session 粘滞(session sticky)方法,使咸鱼的每次请求都打到同一个服务器(如 A 服务器)。但如果 A 服务器宕机了,请求就不得不转到 B 服务器,依然无法解决问题。

于是,有人提出了另一种思路:为什么要让服务器保存 session 呢?可以让每个客户端自己保存!服务器只负责生成 session,不负责保存。

但是,如果不保存 session,如何区分客户端?又如何验证 session 是服务器生成的呢?

这时,人们想到了让服务器生成一个 token。这个 token 是通过服务器独有的密钥和算法(例如 RS256 算法)生成的,并且服务器不会保存这个 token。

这样,客户端发起请求时带上这个 token,服务器收到后会用相同的算法和密钥进行验证。如果 token 匹配,服务器就能验证客户端的身份。

再聊聊 JWT

简单介绍了 token,我们来看看 JWT。

JWT(JSON Web Token)是一种在网络中以 JSON 格式安全地传输信息的令牌。其原理是:服务器认证之后,生成一个 JSON 格式的 token,并将其发回给用户,类似下面这样:

  1. {
  2. "alg": "RSA",
  3. "name": "咸鱼",
  4. "role": "管理员",
  5. "exp": "2024-05-20T00:00:00Z"
  6. }

之后客户端与服务器通信的时候都通过这个 JSON Token 来验证身份,同时为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。

优点:

  • 紧凑性:JWT 被设计成体积较小,便于 URL、POST 参数或 HTTP 头部传输。
  • 自包含:JWT 负载中包含所有必要的信息,不需要在每次请求时访问数据库。
  • 安全性:JWT 可以签名(使用 HMAC 或 RSA 算法),确保数据的完整性和真实性。通过加密(例如 JWE)还可以保证数据的机密性。

结构组成:

JWT 由 Header、Payload、Signature(签名) 三部分组成,其中 Header 和 Payload 都是 JSON 格式( JWT 中的 J ):

  • Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。
  • Payload : 用来存放实际需要传递的数据
  • Signature(签名):服务器通过 Payload、Header 和一个密钥 (Secret) 使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。

编码之后的 JWT 形式是一个很长的字符串,中间用点(.)分隔成三个部分,写成一行(里面没有换行),类似下面这样:

  1. Header.Payload.Signature

关于 JWT 三部分的内容就不多讲了,官网有详细介绍。

jwcrypto 使用

我们可以使用 Python 的 jwcrypto 库来生成和验证 JWT、加密和解密数据,以及签名和验证签名等操作。

jwcrypto 提供了一系列功能,包括但不限于:

  • 生成和验证 JWT:可以使用 jwcrypto 生成 JWT,并在接收端验证 JWT 的有效性。
  • 加密和解密数据:支持使用不同的算法对数据进行加密和解密,例如 AES、RSA 等。
  • 签名和验证签名:支持使用不同的算法对数据进行签名,并在接收端验证签名的有效性。
  • 密钥管理:支持生成和管理密钥对、公钥和私钥,以及密钥的导入和导出。

安装 jwcrypto

  1. pip install jwcrypto

生成一个带有签名的 JWT,其中包含了指定的用户 ID:

  1. from jwcrypto import jwt,jwk
  2. # 使用 RSA 算法生成一个 2048 位的密钥对。
  3. key = jwk.JWK.generate(kty='RSA', size=2048)
  4. payload = {'user_id': 123}
  5. # 创建一个 JWT 对象,并指定其头部(header)为使用 RS256 算法进行签名。
  6. token = jwt.JWT(header={'alg': 'RS256'}, claims=payload)
  7. # 使用之前生成的密钥对 JWT 进行签名。
  8. token.make_signed_token(key)

生成 RSA 密钥对并导出公私钥:

  1. from jwcrypto import jwk
  2. # 生成 RSA 密钥对
  3. key = jwk.JWK.generate(kty='RSA', size=2048)
  4. # 导出公钥和私钥
  5. public_key = key.export_public()
  6. private_key = key.export_private()
  7. # 打印公钥和私钥
  8. print("公钥:")
  9. print(public_key)
  10. print("\n私钥:")
  11. print(private_key)

聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用的更多相关文章

  1. JSON WEB Token(JWT)

    最近面试被问及单点登陆怎么解决?自己的项目前后端分离,自己实现token认证,token有失效时间,token中包含用户基本的信息.且一个当用户重新登陆后,原来的token就会失效,这么安全的一个to ...

  2. JSON Web Token (JWT) 简介

    JSON Web Token (JWT) 是一种基于 token 的认证方案. JSON Web Token 的结构 一个 JWT token 看起来是这样的: eyJhbGciOiJIUzI1NiI ...

  3. JSON Web Token (JWT) 实现与使用方法

    1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该 ...

  4. Json Web Token(JWT)详解

    什么是Json Web Token Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的 ...

  5. JSON Web Token (JWT),服务端信息传输安全解决方案。

    JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式.这些信息可以被验证和信任,因为它是数字签名的 ...

  6. 漫谈JSON Web Token(JWT)

    一.背景 传统的单体应用基于cookie-session的身份验证流程一般是这样的: 用户向服务器发送账户和密码. 服务器验证账号密码成功后,相关数据(用户角色.登录时间等)都保存到当前会话中. 服务 ...

  7. 基于 Token 的身份验证:JSON Web Token(JWT)

    1.传统身份验证和JWT的身份验证 传统身份验证:       HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过 ...

  8. JSON Web Token (JWT) - Introduction

    To validate the challenge, connect as admin.------------以admin登陆 https://jwt.io/introduction/        ...

  9. json web token JWT实现TP5创建和验证

    根据博客进行jwt初始化配置 https://blog.csdn.net/weixin_43389208/article/details/117442266?spm=1001.2014.3001.55 ...

  10. JSON Web Token (JWT) - Weak secret

    This API with its /hello endpoint (accessible with GET) seems rather welcoming at first glance but i ...

随机推荐

  1. C 语言:类型转换与常量的细致理解

    C 语言中的类型转换 有时,您必须将一种数据类型的值转换为另一种类型.这称为类型转换 隐式转换 当您将一种类型的值分配给另一种类型的变量时,编译器会自动进行隐式转换. 例如,如果您将一个 int 值分 ...

  2. sql 语句系列(闰年)[八百章之第十九章]

    前言 判断闰年还是挺有用的. mysql select DAY(LAST_DAY(DATE_ADD(CURRENT_DATE,INTERVAL -DAYOFYEAR(CURRENT_DATE)+1+3 ...

  3. jenkins 持续集成和交付——一个java构件小栗子(四)

    前言 介绍一下java 构建的小栗子. 正文 maven 管理 java 是用maven 管理包的,那么我们是要安装maven的. 还是那句话,安装这种东西呢,去官网下载然后自己安装,不要用yum a ...

  4. iNeuOS工业互联网操作系统,民爆远程运维平台案例

    iNeuOS工业互联网操作系统,民爆远程运维平台案例 目       录 1.      概述... 2 2.      iNeuOS在民爆生产厂区和北京运维中心配置... 3 1.1         ...

  5. k8s架构与原理介绍

    K8s概述 目录 K8s概述 1.什么是K8s 2.K8s 设计架构 3. k8s重要节点描述 4. 过程原理: 5. k8s的核心功能 6. k8s的历史 7. k8s的安装方式 8. k8s的应用 ...

  6. 如何解决打不开Microsoft Store的痛处?

    换了机房后,我最喜欢的计算器和画图3d没有了,网上的方法都行不通,怎么办? 第一步,在百度上搜索你想安装的东西,例如我搜索的画图3d,就会有这个链接. 然后,把这个链接复制到这个网站的搜索框中,就会有 ...

  7. eclipse 汉化语言包/中文补丁/简中设置/中英互换

    eclipse 汉化语言包/中文补丁/简中设置/中英互换 汉化很简单,使用eclipse内置的软件下载就可以,不需要下载压缩包 官方的说明 Open the install wizard with ' ...

  8. 教你如何进行Prometheus 分片自动缩放

    本文分享自华为云社区<使用 Prometheus-Operator 进行 Prometheus + Keda 分片自动缩放>,作者: Kubeservice@董江. 垂直缩放与水平缩放 P ...

  9. 13_总结Vue数据监测

    总结: Vue监视数据的原理:         1.vue会监视data中所有层次的数据         2.如何监视对象中的数据?             通过setter实现监视,且要在new V ...

  10. OpenKruise v0.8.0 核心能力解读:管理 Sidecar 容器的利器

    简介: OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 项目.它来 ...