GO JWT DEMO

server/2024/11/15 5:53:05/

文章目录

      • JWT 使用流程
      • JWT 结构
      • 使用 JWT 的场景
      • JWT 实现示例(Go 语言)
        • 1. 生成 JWT
        • 2. 验证 JWT
        • 3. 在 Gin 中使用
      • 注意事项

JSON Web Token (JWT) 是一种基于令牌的认证方法,在客户端生成一个加密的令牌来存储用户信息,并在每次请求时将该令牌发送给服务器进行验证。JWT 的广泛应用场景包括用户认证、授权、信息交换等。以下是 JWT 的使用方法和常见场景:

JWT 使用流程

  1. 用户登录

    • 用户通过登录页面提交用户名和密码。
    • 服务器验证用户凭证(通常是查询数据库中的用户信息)。
  2. 生成 JWT

    • 服务器验证用户身份成功后,生成 JWT 并将其返回给客户端。
    • JWT 包含用户信息以及签名,签名由服务器使用秘密密钥生成,确保令牌的完整性和真实性。
  3. 发送 JWT

    • 客户端将 JWT 存储在浏览器的本地存储或会话存储中,或者作为 Cookie 存储。
    • 客户端在每次请求时将 JWT 放在请求头部的 Authorization 字段中发送给服务器。
  4. 验证 JWT

    • 服务器从请求中获取 JWT,并使用相同的密钥验证其签名,确保令牌未被篡改。
    • 解析 JWT 获取其中的用户信息,并根据需要执行后续操作(例如,授权访问资源)。
  5. 访问受限资源

    • 服务器验证通过后,允许用户访问受限资源。

JWT 结构

JWT 由三部分组成,每部分使用点 (.) 分隔:

  • Header: 包含令牌的元数据,如类型(JWT)和加密算法(如 HMAC SHA256)。
  • Payload: 包含声明(claims),通常是用户信息,如用户 ID、用户名、以及令牌的过期时间。
  • Signature: 由 Header 和 Payload 结合服务器密钥生成,用于验证令牌的真实性和完整性。

JWT 格式示例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsIm5hbWUiOiJKb2huIERvZSIsImV4cCI6MTYyNTIzMzYwMH0.abc123signature

使用 JWT 的场景

  1. 用户认证和授权

    • 单点登录 (SSO): JWT 非常适合单点登录,用户登录一次即可访问多个应用程序或服务。
    • API 认证: 在微服务架构中,JWT 可以用来在服务之间传递认证信息,确保请求者有权访问特定的服务。
  2. 移动和单页应用(SPA)

    • 在移动应用和单页应用中,使用 JWT 作为身份验证令牌,可以在客户端存储令牌(如在 localStorage 中)并在后续请求中使用。
    • 减少了服务器存储会话数据的需求,降低了服务器的负载。
  3. 信息交换

    • JWT 可以在不同的服务或应用之间安全地传递信息,因为它是自包含的,并且可以被签名和加密。
    • 可以用于传递非敏感的用户信息(如用户 ID、权限等)。
  4. 访问控制

    • 在资源访问控制中,可以使用 JWT 的声明(claims)来包含用户的角色和权限,服务器根据这些信息决定是否允许访问特定资源。

JWT 实现示例(Go 语言)

以下是如何在 Go 中使用 github.com/golang>golang-jwt/jwt 库实现 JWT 认证的示例:

1. 生成 JWT
go">import ("github.com/golang>golang-jwt/jwt""time"
)var jwtKey = []byte("your_secret_key")func GenerateJWT(username string) (string, error) {token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{"username": username,"exp":      time.Now().Add(time.Hour * 72).Unix(), // 令牌过期时间})tokenString, err := token.SignedString(jwtKey)if err != nil {return "", err}return tokenString, nil
}
2. 验证 JWT
go">import ("github.com/golang>golang-jwt/jwt""net/http"
)func AuthenticateJWT(tokenString string) (*jwt.Token, error) {token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {return jwtKey, nil})if err != nil || !token.Valid {return nil, err}return token, nil
}func JWTMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {tokenString := r.Header.Get("Authorization")if tokenString == "" {http.Error(w, "Missing Authorization header", http.StatusUnauthorized)return}_, err := AuthenticateJWT(tokenString)if err != nil {http.Error(w, "Invalid token", http.StatusUnauthorized)return}next.ServeHTTP(w, r)})
}
3. 在 Gin 中使用
go">import ("github.com/gin-gonic/gin""net/http"
)func JWTAuthMiddleware() gin.HandlerFunc {return func(c *gin.Context) {tokenString := c.GetHeader("Authorization")if tokenString == "" {c.JSON(http.StatusUnauthorized, gin.H{"error": "Missing Authorization header"})c.Abort()return}_, err := AuthenticateJWT(tokenString)if err != nil {c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"})c.Abort()return}c.Next()}
}func main() {router := gin.Default()router.Use(JWTAuthMiddleware())router.GET("/protected", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "This is a protected route"})})router.Run(":8080")
}

注意事项

  • 安全性: 确保在生产环境中使用足够复杂的密钥 (jwtKey)。避免在令牌中存储敏感信息,因为它可以被解码。
  • 令牌过期: 确保设置令牌的过期时间,并在服务器上验证令牌是否已过期。
  • 存储: 在客户端存储 JWT 时,请注意安全风险。避免将 JWT 存储在不安全的地方(如浏览器的 localStorage)中,可以考虑使用安全的 HTTP-only cookies。

JWT 提供了一种简单而强大的方式来处理用户认证和授权,但需要小心处理安全细节,确保系统的安全性。


http://www.ppmy.cn/server/121761.html

相关文章

Python范例总结

一、基础功能 1、操作符 and 拥有更高优先级,会先行运算。优先级顺序为 NOT、AND、OR。 2、列表 1)列表拼接 l1 [1,2,3] l2 [4,5,6]# 方法1 # l1 l1 l2# 方法2 # l1[len(l1):len(l1)] l2# 方法3 l1.extend(l2) print(l1) 3、函数 1)范…

9.3 Linux_文件I/O_相关函数

打开与关闭 1、打开文件 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);返回值:成功返回文件描述符,失败返回EOF pathname:文件路径 flags:标志,其中O_RDO…

影响爬虫动态IP质量的因素有哪些?

最近经常刷到关于影响爬虫动态IP质量的因素的话题,许多朋友对此充满了好奇。那么,今天我们一起来深入解析这个问题。 动态IP在爬虫中的重要性 在网络爬虫的世界中,动态IP是一个重要的工具。它允许爬虫程序在采集数据时频繁更换IP地址&#…

手写js中call、apply、bind函数

手写call 原理 将需要改变this指向的函数暂时性的设置为需要设置this指向的对象的函数。 代码 // 定义mycall方法,所有函数对象都是Function对象 Function.prototype.mycall function (thisArg, ...args) {// 设置this,此时this指向原函数&#xff…

C++三大特性之多态

前言 关于多态,是c中最重要的东西,通过虚函数来实现多态这种特性 一、多态的概念 多态是面向对象编程(OOP)中的一个重要概念,它允许对象在不同的上下文中以不同的方式表现。这意味着相同的接口(函数、方法&…

[大语言模型-工程实践] 手把手教你-基于Ollama搭建本地个人智能AI助理

[大语言模型-工程实践] 手把手教你-基于Ollama搭建本地个人智能AI助理 Note: 草稿优化中,持续更新,相关代码将统一提供出来~ 1. Ollama简介 Ollama 是一个用于在本地环境中运行和定制大型语言模型的工具。它提供了一个简单而高效的接口,用于…

SpringMVC详细使用总结教程

一、SpringMVC 1.1 介绍 Spring MVC 是 Spring 框架中的一个模块,用于构建基于 Java 的 Web 应用程序。它基于 MVC(Model-View-Controller)架构模式,提供了一种灵活而强大的方式来开发 Web 应用程序。Spring MVC 框架充分利用了…

loadrunner个人笔记

创建场景配置: 两个同时 去四:日志、时间、模拟、其他自动事务 加一:首选项 1、写脚本,沟通官方、文件打印扫描 MFI-sw.support.gsd.imsc.sda.globalopentext.com support.casemicrofocus.com 支持资源 | Micro Focus | OpenT…