JWT(JSON Web Token)详解以及在go-zero中配置的方法

目的

对用户进行身份认证和信息交换   RFC 7519

传统方式

通过session保存对话信息,服务端返回一个session id,用户保存这个id在cookie内,然后每次请求都传给服务端

局限性

对于服务器集群难以向每个服务器共享同一session

jwt的方式是不在服务端保存session数据,数据只保存在客户端,请求时发给服务端

JWT原理

jwt结构

jwt是个很长的字符串,包含如下部分,每个部分之间用'.'来分隔

  • Header(头部):通常包含两部分信息,token的类型(即JWT)和所使用的签名算法(如HMAC、SHA256或RSA)
  • Payload(负载):包含所要传递的数据。这些数据被称为Claims(声明),分为三种类型:注册声明(例如,iss - 发行者、exp - 过期时间戳)、公共声明(可以自定义,但不建议包含敏感信息)、私有声明(由双方约定的信息)
  • Signature(签名):对前两部分进行签名,以验证消息的发送者并确保消息在传递过程中未被篡改
    • 签名需要指定一个服务器才知道的密钥,然后根据Header指定的签名算法,算出签名
Header.Payload.Signature
额外说明

头部和负载部分本身不加密,以Base64编码传输,所以任何人都可以解码,签名部分才加密,

服务端验证签名,通过则信任jwt的信息未被篡改

工作流程

  • 用户使用其凭证(如用户名和密码)登录系统
  • 服务端验证凭证的正确性,并创建一个包含用户信息的JWT
  • JWT中的负载部分包含所需的数据(如用户ID),然后用服务器的密钥进行签名
  • 服务端将此JWT返回给用户
  • 用户随后的每个请求都将包含这个JWT,通常是在HTTP请求的Authorization头部中携带
  • 服务端接收请求后,会验证JWT的签名并解析负载中的数据,以确定用户的身份和权限

过期时间戳的详细解释

过期时间戳是jwt标准自带标准字段exp

  • 当Token被创建时,exp字段被设定为一个特定的未来时间点。这通常是Token创建时间加上一个预定的时间间隔
  • 当服务端接收到一个请求中的JWT时,它会检查当前时间是否已经超过了Token中的exp时间戳
  • 如果当前时间超过了exp时间,那么Token就被视为无效,服务端通常会拒绝该请求并要求用户重新登录或获取新的Token

时间格式的Unix纪元以来的秒数,跟大部分标准规定的一样的

GoZero中配置

详细见我的这篇文章

GoZero微服务个人探究之路(九)api文件编写总结_go zero api 文件 如何定义参数非必填-CSDN博客

在api文件的@server指定jwt:Auth即可开启jwt,但是框架只做了服务端逻辑,对于 jwt token 的生成及 refresh token 仍需要开发者自行实现

在GoZero框架中配置并启用JWT(JSON Web Token)后,框架会自动处理每个请求中的JWT验证。GoZero的JWT中间件会检查和验证请求中的Token,然后根据验证结果决定是否允许请求通过

相关代码

go中实现创建jwt token 可以使用github.com/dgrijalva/jwt-go库

// 自定义的一些Claims数据结构
type MyCustomClaims struct {UserID string `json:"user_id"`jwt.StandardClaims
}func main() {// 密钥、、var mySigningKey = []byte("mysecretkey")// 创建一个新的Claimsclaims := MyCustomClaims{"1234567890", jwt.StandardClaims{ExpiresAt: time.Now().Add(time.Hour * 24).Unix(), // 设置Token过期时间Issuer:    "xxxxxx",                            // 设置Token的发行者},}// 创建一个Tokentoken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)// 使用密钥签名TokentokenString, err := token.SignedString(mySigningKey)if err != nil {}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue】vue.config.js里面获取本机ip:

文章目录 一、效果:二、实现: 一、效果: 二、实现: const os require(os);function getLocalIpAddress() {const interfaces os.networkInterfaces();for (let key in interfaces) {const iface interfaces[key];for (let i …

第九节HarmonyOS 常用基础组件16-Blank

1、描述 空白填充组件,在容器主轴方向上,空白填充组件具有自动填充容器空余部分的能力。仅当父组件为Row/Column/Flex时生效。 2、接口 Blank(min?: number | string) 3、参数 参数名 参数类型 必填 描述 min number|string 否 空白填充组件…

数据分析入门指南:用 Python 开启数据之旅

文章目录 前言发现宝藏为什么选择 Python 进行数据分析?准备工作数据分析基础1. 数据加载2. 数据探索3. 数据清洗4. 数据可视化 探索更多可能性好书推荐总结 前言 为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。…

成都直播产业园核心优势全面解读,入驻天府锋巢直播产业基地都有哪些好处?

一文讲清!成都直播产业园核心优势全面解读 企业入驻天府锋巢直播产业基地能获得哪些好处? 锋巢资讯~又来了~~~ 今天,将为您全面解读成都产业园重点特色产业服务(上) 什…

Android 13以上版本读写SD卡权限适配

如题&#xff0c;最近工作上处理的问题&#xff0c;把解决方案简单逻列出来&#xff0c;供有需要的朋友参考之 解决方案&#xff1a; 1、配置权限 <uses-permission android:name"android.permission.READ_MEDIA_IMAGES" /><uses-permission android:name&q…

(自用)learnOpenGL学习总结-高级OpenGL-立方体贴图

ok终于来到了立方体贴图了&#xff0c;在这里面我们可以加入好看的天空包围盒&#xff0c;这样的画我们的背景就不再是黑色的了&#xff01; 首先&#xff0c;立方体贴图和前面的sampler2D贴图一样&#xff0c;不过是6个2D组成的立方体而已。 那么为什么要把6个组合在一起呢&…

树莓派部署Nginx服务结合内网穿透实现远程访问本地站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

怎样用流程自定义表单提升办公效率?

如果想要提升办公协作效率&#xff0c;可以试试低代码技术平台及流程自定义表单工具。不可否认的是&#xff0c;随着社会的进步和发展&#xff0c;传统的表单制作工具已经没有办法再满足业务量不断上涨的办公需求了&#xff0c;但是&#xff0c;借助专业的流程自定义表单工具就…

AES 加解密python实现

1. 要求 编程实现AES-128的加解密算法&#xff0c;满足给定明文和密钥加密得到密文&#xff0c;给定密文和密钥解密得到明文&#xff0c;最终用界面化的形式呈现。 2. 算法流程 程序主要分为加密与解密两个大模块。在加密模块中包括四个小模块&#xff0c;分别为轮密钥加、字…

Android 系统启动流程

依旧是带着问题再去学习 首先&#xff0c;Android是怎么启动的&#xff1f; Android服务是怎么启动的&#xff1f; Android线程是怎么切换的&#xff1f; Android ApplicationThread是怎么创建的&#xff1f; 那么接下来开始分析Android的启动流程 还是一步一图 先画一张流…

vp9协议梳理-header头文件

vp9协议梳理-header头文件 本文是对vp9视频码流中header中包含的语法元素的一个分类整理&#xff0c;及其对具体的解码过程的影响的分析。 这里写目录标题 vp9协议梳理-header头文件1. Vp9码流中的header头文件2. profile3. show_existing_frame, frame_to_show_map_idx4. fr…

What is Rust? Why Rust?

why Rust&#xff1f; 目前&#xff0c;Rust 变得越来越流行。然而&#xff0c;仍然有很多人&#xff08;和公司&#xff01;&#xff09;误解了 Rust 的主张价值是什么&#xff0c;甚至误解了它是什么。在本文中&#xff0c;我们将讨论 Rust 是什么以及为什么它是一种可以增强…

vivado 配置内存IP

配置内存IP UltraScale体系结构内存IP支持DDR3和DDR4 SDRAM的配置&#xff0c;QDRIIPLUS SRAM和RLDRAM3型接口。截至2015.3&#xff0c;内存IP已被拆分基于内存接口标准和工具流&#xff0c;将其划分为不同的IP。“自定义IP”对话框框包含基本和高级配置选项&#xff0c;其中包…

【C/C++ 05】快速排序

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序算法&#xff0c;其基本思想是&#xff1a;任取待排序序列中的某元素作为基准值&#xff0c;按照该基准值将待排序集合分割成两个子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子序列中所有元素均大于…

数据在网络传输中为什么要加密?

在信息化浪潮席卷全球的今天&#xff0c;数据如同流淌在信息高速公路的生命血液&#xff0c;其安全传输的重要性不言而喻。随着网络空间中各种威胁与挑战日益凸显&#xff0c;加密技术已成为保护数据安全、维护用户隐私、确保业务连续性的关键手段。它就如同一道无形的防护盾&a…

Nestjs 全局拦截器

一、拦截器 拦截器作用&#xff1a; 在函数执行之前、之后绑定额外的逻辑转换函数的返回结果转换从函数抛出的异常扩展基本函数的行为根据所选条件重写函数 期望接口返回一个标准的json格式&#xff0c;利用拦截器对数据做全局的格式化 {code: "200",data: [],mess…

【文本到上下文 #7】探索 NLP 中的 Seq2Seq、编码器-解码器和注意力机制

一、说明 今天&#xff0c;我们将探讨序列到序列 &#xff08;seq2seq&#xff09; 模型的复杂工作原理&#xff0c;特别关注编码器-解码器架构和注意力机制。这些概念是各种 NLP 应用的基础&#xff0c;从机器翻译到问答系统。 这是可以期待的&#xff1a; Seq2Seq模型中的编码…

数据结构之单链表详解

前言 之前大摆了5天多&#xff0c;没怎么学编程&#xff0c;自昨日起&#xff0c;觉不可如此&#xff0c;痛定思痛&#xff0c;开始继续学习&#xff0c;昨天刷了20多道简单级别的力扣&#xff0c;今天想把链表好好巩固一下&#xff0c;于是乎&#xff0c;把单链表的增删查改搞…

基础算法之Huffman编码

// Type your code here, or load an example. #include<iostream> #include<string> #include<queue> #include <unordered_map> #include <vector>using namespace std;//树节点结构 struct Node {char ch;int freq;Node *left;Node *right;No…

数据结构3、基于栈的后缀算术表达式求值

1 题目描述 图1 中缀表达式转化为后缀表达式题目描述 图2 基于栈的后缀算术表达式求值题目描述 2 题目解读 借助一个运算符栈&#xff0c;可将中缀表达式转化为后缀表达式&#xff1b;借助一个运算数栈&#xff0c;可对后缀表达式求值。借助一个运算符栈和一个运算数栈&#xf…