HTTP API 认证技术详解(三):JWT Authentication

目录

什么是 JWT Authentication 认证

JWT 的组成部分

JWT 的工作流程

使用 Golang 实现 JWT  Authentication 认证

安全注意事项

JWT Authentication 认证的优缺点

小结


HTTP API 认证技术主要用于验证客户端身份,并确保只有经过授权的实体才能访问受保护的资源。随着安全需求的日益增长,API 认证技术也在不断发展和演进。本文将详细讲解 Digest Access Authentication 认证技术。

什么是 JWT Authentication 认证

JWT(JSON Web Tokens)是一种开放标准(RFC 7519),定义了一种紧凑的、自包含的格式,用于实现网络应用程序中的身份验证和授权机制。

JWT 的组成部分

一个 JWT 通常由三部分组成,分别是头部(Header)、负载(Payload)和签名(Signature)。

  • 头部 (Header):这部分包含了 JWT 的元数据,如类型(通常是JWT)和所使用的签名算法(如 AES256 或 RSA)。
  • 负载 (Payload): 包含了实际需要传递的数据,通常包括用户的身份信息(如用户 ID)以及一些元数据(如令牌的有效期)。
  • 签名 (Signature):对前两部分进行签名以确保数据的完整性和真实性。服务端生成签名时会使用一个密钥,客户端使用这个密钥(或者公钥)来验证签名的有效性。

JWT 的工作流程

  1. 用户在客户端使用登录凭证(如用户名和密码)登录系统。
  2. 系统验证登录凭证的有效性,如果验证通过的话生成一个 JWT 并返回给客户端。
  3. 客户端存储 JWT,并在随后的请求中将其作为认证凭证发送给服务端。
  4. 服务端验证 JWT 的签名,并从中提取用户信息以完成认证过程。

使用 Golang 实现 JWT  Authentication 认证

  1. 实现生成 JWT 令牌的函数,首先需要一个处理 JWT 的库。github.com/dgrijalva/jwt-go 是 Go 中一个比较流行的 JWT 库,接下来会使用这个库来实现。简单示例代码如下:
package mainimport ("fmt""github.com/dgrijalva/jwt-go""time"
)var jwtKey = []byte("my_secret_key")type Claims struct {Username string `json:"username"`jwt.StandardClaims
}func GenerateJWT(username string) (string, error) {expirationTime := time.Now().Add(5 * time.Minute)claims := &Claims{Username: username,StandardClaims: jwt.StandardClaims{ExpiresAt: expirationTime.Unix(),},}token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)tokenString, err := token.SignedString(jwtKey)if err != nil {return "", err}return tokenString, nil
}func main() {tokenString, err := GenerateJWT("user1")if err != nil {fmt.Println("Error generating token:", err)return}fmt.Println("Generated Token:", tokenString)
}

定义了一个 Claims 结构体,包含用户的用户名和标准 JWT 声明,使用了一个简单的密钥来签名令牌,并设置了5分钟的过期时间。

  1. 实现验证 JWT 令牌的函数,用户每次请求时,服务端需要验证 JWT 令牌。解析和验证JWT的示例代码如下:
func ValidateJWT(tokenString string) (*Claims, error) {claims := &Claims{}token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {return jwtKey, nil})if err != nil {return nil, err}if !token.Valid {return nil, fmt.Errorf("invalid token")}return claims, nil
}
  1. 创建一个 HTTP 服务,完整代码如下:
package mainimport ("encoding/json""fmt""github.com/dgrijalva/jwt-go""net/http""time"
)var jwtKey = []byte("my_secret_key")type Claims struct {Username string `json:"username"`jwt.StandardClaims
}func GenerateJWT(username string) (string, error) {expirationTime := time.Now().Add(5 * time.Minute)claims := &Claims{Username: username,StandardClaims: jwt.StandardClaims{ExpiresAt: expirationTime.Unix(),},}token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)tokenString, err := token.SignedString(jwtKey)if err != nil {return "", err}return tokenString, nil
}func ValidateJWT(tokenString string) (*Claims, error) {claims := &Claims{}token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {return jwtKey, nil})if err != nil {return nil, err}if !token.Valid {return nil, fmt.Errorf("invalid token")}return claims, nil
}func Login(w http.ResponseWriter, r *http.Request) {// 假设我们从请求中获取用户名和密码username := r.FormValue("username")// password = r.FormValue("password")// 这里应该验证用户名和密码的正确性// 为了示例,我们假设任何用户名密码组合都是有效的tokenString, err := GenerateJWT(username)if err != nil {w.WriteHeader(http.StatusInternalServerError)return}w.Write([]byte(tokenString))
}func Home(w http.ResponseWriter, r *http.Request) {tokenString := r.Header.Get("Authorization")claims, err := ValidateJWT(tokenString)if err != nil {w.WriteHeader(http.StatusUnauthorized)return}json.NewEncoder(w).Encode(claims)
}func main() {http.HandleFunc("/login", Login)http.HandleFunc("/home", Home)http.ListenAndServe(":8080", nil)
}

有两个路由处理函数,Login 函数生成 JWT 并返回给用户。Home 函数则需要用户将 JWT作为 Authorization(也可以使用其他字段) 头部发送,以验证用户的请求。

安全注意事项

  • 应该使用满足复杂度要求的密钥,密钥不能硬编码在代码中。在生产环境中,应该使用配置中心或密钥管理系统来安全地存储密钥。
  • 尽量使用 HTTPS 协议通信,防止中间人攻击。
  • 应该给 JWT 设置一个合理的过期时间,减少令牌被盗用的风险。

JWT Authentication 认证的优缺点

JWT 的优点如下:

  • JWT 所有必要的信息都储存在令牌本身,不需要在服务器存储。这一特性非常适合分布式系统和微服务架构。
  • JWT 包含验证所需的所有信息,减少了查询数据库或存储系统的次数。
  • JWT 是基于 JSON 的,可以在不同的编程语言和平台之间轻松传输和处理。
  • 由于无需查询数据库验证用户的每个请求,可以提高应用程序的响应速度和性能。
  • JWT 可以通过 URL、POST 参数或在 HTTP 头中传输,使用起来非常灵活。
  • JWT 是一个开放标准(RFC 7519),有良好的社区支持和大量的库可以使用。
  • JWT 支持多种签名算法,如 AES256 和 RSA 等,可以确保令牌在传输过程中不被篡改。

JWT 的缺点如下:

  • JWT 一旦被颁发,在过期之前很难被吊销,除非在服务器端引入额外的逻辑来控制。
  • 由于 JWT 是自包含的,大小通常比其他的会话信息要大,可能会增加传输数据的负担。
  • 生成 JWT 使用的签名算法不够强大或者使用的密钥被泄露,那么 JWT 的信息就可能被解码。
  • JWT 的有效性依赖于时间戳,因此需要确保服务器和客户端之间的时间同步。
  • 对于需要细粒度控制用户会话的应用程序,使用 JWT 可能会增加实现的复杂性,因为需要在服务器端实现额外的逻辑来处理令牌的失效和刷新。

小结

JWT 是一种非常灵活的认证方式,可以用于多种场景,例如用户认证、服务间 API 调用认证等。但是 JWT 也存在固有的缺点,需要根据自己的使用场景做出最合适的选择。

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

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

相关文章

力扣337. 打家劫舍 III(java 动态规划)

Problem: 337. 打家劫舍 III 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 1.构建多阶段决策模型:树形DP基于树这种数据结构上的推导,一般都是从上往下推,子节点状态推导父节点状态,一般都是基于后续遍历来实现。 2.定…

015集:进程与线程:多线程运行实例—python基础入门实例

1、进程:我们可以理解为是一个可以独立运行的程序单位。 比如:打开一个浏览器,这就开启了一个浏览器进程;打开一个文本编辑器,这就开启了一个文本编辑器进程。但一个进程中是可以同时处理很多事情的。 比如&#xff1…

vue选项式API和组合式Api

组合式 API 和选项式 API 是 Vue.js 提供的两种不同的 API。组合式 API 更加灵活&#xff0c;在处理复杂场景时更有效&#xff0c;而选项式 API 则更易于入门和使用&#xff0c;适合处理简单的场景。下面是组合式 API 和选项式 API 的一个比较&#xff1a; 组合式 API <te…

“一键批量处理:轻松缩小图片像素,提升工作效率“

"在忙碌的工作中&#xff0c;时间就是金钱。使用我们的图片批量处理工具&#xff0c;轻松缩小图片像素&#xff0c;让您的工作更加高效。一键操作&#xff0c;告别繁琐&#xff0c;让您有更多时间享受生活。高效工作&#xff0c;从这里开始&#xff01;" 第一步&…

postman 简单测试(一)

1.postman官网 Postman API Platform 2.研究了一下postman 一些简单的功能&#xff0c;自己做个记录&#xff0c;同时希望能节约点测试时间。 2.1新建一个 collections 长期测的话&#xff0c;最好注册一个账号&#xff0c;开放更多功能。 2.2新建一个请求 后端要先搭建起来…

ModuleNotFoundError: No module named ‘SwissArmyTransformer‘

小问题&#xff0c;直接pip install pip install SwissArmyTransformer 但是&#xff0c;安装之后却还是提示&#xff0c;屏幕上依然标红 ModuleNotFoundError: No module named SwissArmyTransformer 查找环境目录发现&#xff0c; 这是因为新版的SwissArmyTransformer中&…

2024年四川省众创空间和科技企业孵化器申报条件及各区县奖励补助

一、四川省各地市众创空间、科技企业孵化器奖励补贴 对新建的国家和省级科技企业孵化器&#xff08;含改扩建&#xff09;和大学科技园给予不超过100万元的奖励性后补助&#xff1b; 对新建的国家和省众创空间、国家专业化众创空间给予不超过50万元的奖励性后补助。强化孵化器…

关键信息基础设施安全相关材料汇总

文章目录 前言一、法律(1)《中华人民共和国国家安全法》(2)《中华人民共和国网络安全法》(3) 《中华人民共和国密码法》(4)《中华人民共和国数据安全法》(5) 《中华人民共和国个人信息保护法》二、行政法规(6)《中华人民共和国保守国家秘密法实施条例》(7) 《关键信息基础设施安…

AI嵌入式K210项目(6)-开启双核模式

文章目录 前言一、K210双核心和BSP介绍二、实验过程代码实现 总结 前言 前面我们在介绍K210时提及到&#xff0c;K210芯片中有两个RISC-V核心&#xff0c;一般情况下&#xff0c;只有一个核心在运行&#xff0c;本章将介绍如何开启双核模式。 一、K210双核心和BSP介绍 K210系…

CXYGZL-程序员工作流,持续迭代升级中

概述 现在开源的工作流引擎&#xff0c;基本都是以BPMN.js为基础的&#xff0c;导致使用门槛过高&#xff0c;非专业人员无法驾驭。本工作流借鉴钉钉/飞书的方式&#xff0c;以低代码方式降低用户使用门槛&#xff0c;即使是普通企业用户也可以几分钟内就能搭建自己的工作流引…

CC工具箱使用指南:【获取所有字段信息】

一、简介 这个工具的目的简单易懂&#xff0c;就是获取选定要素图层的所有字段信息。 本身不对要素图层作任何处理&#xff0c;只是一个查看属性的工具。 问我要用在什么地方&#xff0c;我也不知道-_- 二、工具参数介绍 点击【信息获取】组里的【获取所有字段信息】工具&a…

Vue3中使用自定义指令

一&#xff0c;自定义指令&#xff1a; 应用场景&#xff1a;禁用按钮多次点击 1.vue2 a. src/libs/preventClick.js import Vue from vue const preventClick Vue.directive(preventClick, {inserted: function (el, binding) {el.addEventListener(click, () > {if (!el…

网络协议与攻击模拟_04ICMP协议与ICMP重定向

ICMP协议是网络层协议&#xff0c; 利用ICMP协议可以实现网络中监听服务和拒绝服务&#xff0c;如 ICMP重定向的攻击。 一、ICMP基本概念 1、ICMP协议 ICMP是Internet控制报文协议&#xff0c;用于在IP主机、路由器之间传递控制消息&#xff0c;控制消息指网络通不通、主机是…

windows系统下docker软件中使用ubuntu发行版本的linux系统

1.软件下载 官网下载地址 下载安装之后&#xff0c;再去微软商店下载wsl软件&#xff0c;可以直接用&#xff0c;或者也可以使用命令行拉取&#xff08;下面会讲&#xff09; 2.在docker里面创建容器的两种方法 2.1.命令行创建 前言&#xff1a;输入 winr 打开命令行进行下面…

【经典算法】有趣的算法之---遗传算法梳理

every blog every motto: You can do more than you think. 0. 前言 遗传算法是一种基于自然选择和遗传机制的优化算法&#xff0c;因此它通常被用于求解各种最优化问题&#xff0c;例如函数优化、特征选择、图像处理等。 一言以蔽之&#xff1a; 将数学中的优化问题&#xf…

Rust 基础语法

本章主要了解可变变量、不可变变量、函数、基本类型、注释、所有权、借用。 1、定义变量&#xff0c;Rust中有可变变量和不可变变量的区别&#xff0c;不废话上代码 fn main() {//创建一个不可变的变量xlet x5;//创建一个可变的变量ylet mut y6;x10;y11;//打印变量x、y的值pr…

pythonnumpy十二: 使用numpy完成图像处理

使用NumPy可以进行简单的图像处理操作&#xff0c;例如调整图像大小、裁剪图像、旋转图像、改变图像亮度等。下面是一些示例&#xff1a; 1.调整图像大小&#xff1a; import numpy as np from PIL import Image# 打开图像 image Image.open(image.jpg)# 调整图像大小 new_s…

高级分布式系统目录汇总

临近《高级分布式系统》考试&#xff0c;所以一边复习((⊙o⊙)…&#xff0c;其实是预习&#xff0c;哈哈^_^)&#xff0c;一边写高级分布式博客。先将高级分布式章节以及相关博客罗列如下&#xff0c;欢迎和大家一起学习。资料部分参考上了以下教材&#xff1a; 分布式实时系统…

超形象图解Python NumPy

超形象图解Python NumPy&#xff01;

邦芒支招:三招教你迅速度过职场迷茫期

在职场与同事相处的时间要多过家人&#xff0c;处理不好职场中同事间的关系&#xff0c;每一天都在不开心中度过。 ​ ​职场新人最难处理的并不是工作&#xff0c;而是职场关系&#xff0c;即使很多职场老司机也未必把握得当&#xff0c;反而成为很多职场上的失败案例。 尽管…