首页 > 其他分享 >JWT 的核心工作原理是什么?集群中的其他 服务如何验证这个JWT 呢?

JWT 的核心工作原理是什么?集群中的其他 服务如何验证这个JWT 呢?

时间:2024-07-04 19:08:22浏览次数:14  
标签:验证 jwt JWT datetime token 集群 签名

JWT(JSON Web Token)是一种用于身份验证和信息交换的紧凑、URL 安全的令牌。JWT 的核心工作原理包括三个主要部分:头部(Header)、载荷(Payload)和签名(Signature)。以下是对 JWT 核心工作原理的详细解释以及在集群环境中如何验证 JWT 的说明。

JWT 核心工作原理

  1. 头部(Header)

    • 头部通常包括令牌类型(即 "JWT")和所使用的签名算法(如 HMAC SHA256 或 RSA)。
    • 例如:
      {
        "alg": "HS256",
        "typ": "JWT"
      }
      
  2. 载荷(Payload)

    • 载荷包含声明(claims),即要传递的用户信息。声明有三种类型:
      • 注册声明(Registered claims):一组预定义的声明,不是强制性的,但推荐使用,如 iss(发行者)、exp(到期时间)、sub(主题)、aud(受众)。
      • 公共声明(Public claims):可以由用户定义,但应避免冲突。
      • 私有声明(Private claims):自定义的声明,用于信息交换。
    • 例如:
      {
        "sub": "1234567890",
        "name": "John Doe",
        "admin": true
      }
      
  3. 签名(Signature)

    • 为了确保令牌的完整性和真实性,JWT 会对头部和载荷进行签名。
    • 签名的生成步骤:
      1. 将头部和载荷分别进行 Base64Url 编码。
      2. 将编码后的头部和载荷用句点(.)连接起来。
      3. 使用指定的算法和一个密钥对连接后的字符串进行签名。
    • 例如,对于 HMAC SHA256 算法:
      HMACSHA256(
        base64UrlEncode(header) + "." + base64UrlEncode(payload),
        secret
      )
      

JWT 的生成和验证

  1. 生成 JWT

    • 服务器在用户登录成功后,创建一个 JWT,包括头部、载荷,并使用密钥签名。
    • 生成的 JWT 通过 HTTP 响应返回给客户端。
  2. 验证 JWT

    • 客户端在后续请求中将 JWT 放在 HTTP 请求头的 Authorization 字段中发送给服务器。
    • 服务器接收到请求后,提取 JWT,使用相同的签名算法和密钥验证签名的有效性。
    • 如果签名有效且令牌未过期,则允许访问资源。

集群环境中的 JWT 验证

在集群环境中,多个服务实例可能需要验证 JWT。为了实现这一点,通常有以下几种方法:

  1. 共享密钥

    • 对于对称加密算法(如 HMAC SHA256),所有服务实例共享同一个密钥来签名和验证 JWT。
    • 缺点是密钥必须在所有实例之间安全地分发和存储。
  2. 使用公钥/私钥对

    • 对于非对称加密算法(如 RSA 或 ECDSA),使用私钥签名 JWT,使用公钥验证 JWT。
    • 发行者服务持有私钥,签发 JWT。验证者服务持有公钥,验证 JWT。
    • 公钥可以公开分发,安全性更高且易于管理。
  3. 集中认证服务

    • 实现一个专门的认证服务,负责签发和验证 JWT。其他服务在需要时调用该认证服务进行 JWT 验证。
    • 这种方法可以集中管理密钥,提高安全性和灵活性,但引入了额外的服务调用开销。

具体实现

共享密钥的示例

假设我们使用对称加密(HMAC SHA256),以下是共享密钥的生成和验证过程:

生成 JWT

import jwt
import datetime

secret = 'my_secret_key'
payload = {
    'sub': '1234567890',
    'name': 'John Doe',
    'iat': datetime.datetime.utcnow(),
    'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)
}

token = jwt.encode(payload, secret, algorithm='HS256')
print(token)

验证 JWT

import jwt

token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...'  # 接收到的 JWT
secret = 'my_secret_key'

try:
    decoded_payload = jwt.decode(token, secret, algorithms=['HS256'])
    print(decoded_payload)
except jwt.ExpiredSignatureError:
    print('Token has expired')
except jwt.InvalidTokenError:
    print('Invalid token')

使用公钥/私钥对的示例

假设我们使用非对称加密(RSA),以下是生成和验证 JWT 的过程:

生成 JWT

import jwt
import datetime

private_key = '''-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA2LV5N2G3F6vA...
-----END RSA PRIVATE KEY-----'''

payload = {
    'sub': '1234567890',
    'name': 'John Doe',
    'iat': datetime.datetime.utcnow(),
    'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)
}

token = jwt.encode(payload, private_key, algorithm='RS256')
print(token)

验证 JWT

import jwt

token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...'  # 接收到的 JWT
public_key = '''-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...
-----END PUBLIC KEY-----'''

try:
    decoded_payload = jwt.decode(token, public_key, algorithms=['RS256'])
    print(decoded_payload)
except jwt.ExpiredSignatureError:
    print('Token has expired')
except jwt.InvalidTokenError:
    print('Invalid token')

结论

JWT 的核心工作原理是通过头部、载荷和签名确保令牌的完整性和安全性。在分布式系统中,可以通过共享密钥或公钥/私钥对实现 JWT 的验证。采用非对称加密时,私钥用于签名,公钥用于验证,这种方式安全性更高且易于管理。集中认证服务也是一种有效的实现方式,但需要权衡性能和安全性。

标签:验证,jwt,JWT,datetime,token,集群,签名
From: https://www.cnblogs.com/gongchengship/p/18284486

相关文章

  • golang 中 Jwt 的验证及续期使用
    创建Utils的Jwt文件,用于创建JwtToken 和  验证并继期packageutilsimport("errors""fmt""github.com/dgrijalva/jwt-go""strings""time")//生成JwtToken//@ParamsecretKey表示jwtsecretKey【***......
  • 【超万卡GPU集群关键技术深度分析 2024】
    文末有福利!1.集群高能效计算技术随着大模型从千亿参数的自然语言模型向万亿参数的多模态模型升级演进,超万卡集群吸需全面提升底层计算能力。具体而言,包括增强单芯片能力、提升超节点计算能力、基于DPU(DataProcessingUnit)实现多计算能力融合以及追求极致算力能效......
  • flink提交yarn 集群模式失败
    flink版本1.14.6在通过./bin/flinkrun-application-tyarn-application模式提交到yarn时失败。报错信息:点击查看代码Causedby:java.lang.ClassCastException:cannotassigninstanceoforg.apache.kafka.clients.consumer.OffsetResetStrategytofieldorg.apache.......
  • VMware vSphere Tanzu部署_13_创建TKC集群
    1.登录tanzu集群登录语法为:kubectlvspherelogin--server=--vsphere-username--insecure-skip-tls-verify$kubectlvspherelogin--server=192.168.203.194--vsphere-usernameadministrator@vsphere.local--insecure-skip-tls-verify登录示例jianhua@napp:~$k......
  • K8S学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群
    前言Redis是在开发过程中经常用到的缓存中间件,为了考虑在生产环境中稳定性和高可用,Redis通常采用集群模式的部署方式。在制定Redis集群的部署策略时,常规部署在虚拟机上的方式配置繁琐并且需要手动重启节点,相较之下,使用PetaExpress提供的Kubernetes(k8s)服务进行Redis集......
  • MySQL中的可插拔身份验证(Pluggable Authentication)(二)
    PluggableAuthentication(PAM,即可插拔式认证模块)是一种高效且灵活的用户级别的认证方式,广泛应用于现代操作系统,特别是Linux服务器中。它允许数据库管理员(DBAs)为MySQL用户帐户选择和更改不同的认证方法。1身份验证插件客户端/服务器兼容性可插拔身份验证使MySQL帐户在选择身......
  • MySQL中的可插拔身份验证(Pluggable Authentication)(一)
    PluggableAuthentication(PAM,即可插拔式认证模块)是一种高效且灵活的用户级别的认证方式,广泛应用于现代操作系统,特别是Linux服务器中。它允许数据库管理员(DBAs)为MySQL用户帐户选择和更改不同的认证方法。当客户端尝试连接到MySQL服务器时,服务器会使用客户端提供的用户名和主机......
  • Apache Hadoop完全分布式集群搭建指南
    Hadoop发行版本较多,Cloudera版本(Cloudera’sDistributionIncludingApacheHadoop,简称CDH)收费版本通常用于生产环境,这里用开源免费的ApacheHadoop原始版本。下载:ApacheHadoop版本下载:Indexof/hadoop/commonHadoop基础知识可查看本专栏其它篇章:ApacheHadoop的核心组成......
  • 2.Kubernetes集群架构与组件
    一、Kubernetes组件       1.1控制面板组件(都是在master上面的)               kube-apiserver:对节点以及任务处理的一个相关接口(所有的调用都要经过这个组件调用)               kube-controller-manager:控制器管理器,管理各个类型的......
  • NoSQL 之 Redis 集群部署
    前言:(1)主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。(2)哨兵:在主从复制的基础上,哨兵实......