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.hqwc.cn/news/441221.html

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

相关文章

备战蓝桥杯---数据结构与STL应用(基础实战篇1)

话不多说,直接上题: 当然我们可以用队列,但是其插入复杂度为N,总的复杂度为n^2,肯定会超时,于是我们可以用链表来写,同时把其存在数组中,这样节点的访问复杂度也为o(1).下面是AC代码: 下面我们来…

学习MySQL仅此一篇就够了(视图)

视图 介绍及基本语法 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视 图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存了查询的SQL逻辑&#xf…

我在代码随想录|写代码Day20之二叉树-700. 二叉搜索树中的搜索,98. 验证二叉搜索树,530.二叉搜索树的最小绝对差

学习目标: 博主介绍: 27dCnc 专题 : 数据结构帮助小白快速入门 👍👍👍👍👍👍👍👍👍👍👍👍 ☆*: .。. o(≧▽≦)…

TypeScript(八) number和string

1. TypeScript number 1.1. 描述 Number对象是原始数值的包装对象。 1.2.语法 var num new Number(value);;注意:如果一个参数值不能转换为一个数字,将返回NaN(非数字值)。 1.3. 对象属性 属性描述MAX_VALUE可表示的最大的数…

深度学习-搭建Colab环境

Google Colab(Colaboratory) 是一个免费的云端环境,旨在帮助开发者和研究人员轻松进行机器学习和数据科学工作。它提供了许多优势,使得编写、执行和共享代码变得更加简单和高效。Colab 在云端提供了预配置的环境,可以直接开始编写代码&#x…

【CMU-自主导航与规划】Autonomous Exploration Development Environment 配置与运行

官方文档:https://www.cmu-exploration.com/ 一、安装与配置: 适用版本: Ubuntu 18.04 ROS Melodic and Ubuntu 20.04 with ROS Noetic. 如果使用 Ubuntu 22.04 with ROS2 Humble, 则需要配置ROS2【https://drive.google.com/file/d/1a01RS…

鸿蒙新风口,湖南码牛助你高薪起飞!

去年9月底,在华为秋季全场景新品发布会上,华为常务董事、终端BG CEO余承东宣布,鸿蒙原生应用全面启动,HarmonyOS NEXT开发者预览版将在2024年第一季度开放。 HarmonyOS 2019年正式面世,至今已成长了4年,截至…

86.网游逆向分析与插件开发-物品使用-物品丢弃的逆向分析与C++代码的封装

内容参考于:易道云信息技术研究院VIP课 上一个内容:物品使用的逆向分析与C代码的封装-CSDN博客 码云地址(ui显示角色数据 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:7563f86877c…

2023年春秋杯网络安全联赛冬季赛_做题记录

可信计算 基于挑战码的双向认证1 可信计算赛题-双向认证挑战模式.docx 使用命令进行SSH登录上去 ssh player8.147.131.156 -p 18341 # 记得加上-p参数指定端口,不然默认的是22端口看见word文档的提示,先尝试一下 直接获得了flag1 web 魔术方…

基于视觉的移载协作机器人机床上下料末端纠偏算法

摘 要 针对复合机器人在机床上下料中的定位方法,本文主要关注识别机床卡盘和末端作业面的定位。首先分 析了复合机器人在机床上下料过程中的工作原理及其基本结构,包括 AGV (自动导引车)和协作机器人 的功能及特点。然后,详细阐述了如何使用视觉系统和纠偏算法来…

电动汽车|不同类型电动汽车充电负荷蒙特卡洛法模拟研究(包括常规充电、快速充电、更换电池)

目录 主要内容 结果一览 常规充电 快速充电 更换电池 详实文档资料 下载链接 主要内容 本程序采用蒙特卡洛模拟了不同类型电动汽车充电负荷特点,包括常规充电、快速充电和更换电池三种。 充放电行为分为无序充电行为、受控充电行为和受控充放电行为…

「仅需三次鼠标,即可开服」幻兽帕鲁全自动部署教程

在帕鲁的世界,你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活,也可以为你在工厂工作。你也可以将它们进行售卖,或肢解后食用。 本文将为您提…