gin入门教程(10):实现jwt认证

embedded/2024/10/30 19:56:34/

使用 github.com/golang-jwt/jwt 实现 JWT(JSON Web Token)可以有效地进行用户身份验证,这个功能往往在接口前后端分离的应用中经常用到。以下是一个基本的示例,演示如何在 Gin 框架中实现 JWT 认证。

目录结构

/hello-gin
│
├── cmd/
│   └── main.go
├── api/
│   ├── routes.go
│   └── auth.go
└── middleware/└── jwt.go
└── models/└── user.go

1. 安装依赖

首先,你需要安装 github.com/golang-jwt/jwt 包:

go get github.com/golang-jwt/jwt

go_26">2. cmd/main.go

主程序,设置路由和中间件

go">package mainimport ("hello-gin/api""github.com/gin-gonic/gin"
)func main() {r := gin.Default()// 注册路由api.RegisterRoutes(r)// 启动服务器r.Run(":8080")
}

go_49">3. api/routes.go

定义路由,包括登录和受保护的资源。

go">package apiimport ("github.com/gin-gonic/gin""hello-gin/middleware"
)func RegisterRoutes(r *gin.Engine) {r.POST("/login", Login)// 受保护的路由protected := r.Group("/protected")protected.Use(middleware.JWTAuthMiddleware()){protected.GET("/hello", Hello)}
}

go_74">4. api/auth.go

处理登录和生成 JWT 的逻辑。

go">package api
import ("net/http""github.com/gin-gonic/gin""github.com/golang-jwt/jwt""time"
)var jwtSecret = []byte("your_secret_key")// User 表示一个简单的用户结构
type User struct {Username string `json:"username"`Password string `json:"password"`
}// Login 处理用户登录并返回 JWT
func Login(c *gin.Context) {var user Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid input"})return}// 这里简单的硬编码验证,实际使用中应查询数据库if user.Username != "testuser" || user.Password != "testpassword" {c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid credentials"})return}// 生成 JWTtoken := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{"username": user.Username,"exp":      time.Now().Add(time.Hour * 72).Unix(),})tokenString, err := token.SignedString(jwtSecret)if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": "Could not generate token"})return}c.JSON(http.StatusOK, gin.H{"token": tokenString})
}// Hello 是一个受保护的路由示例
func Hello(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Hello, authenticated user!"})
}

go_131">5. middleware/jwt.go

实现 JWT 验证中间件

go">package middlewareimport ("net/http""github.com/gin-gonic/gin""github.com/golang-jwt/jwt"
)var jwtSecret = []byte("your_secret_key")// JWTAuthMiddleware 验证 JWT 的中间件
func JWTAuthMiddleware() gin.HandlerFunc {return func(c *gin.Context) {tokenString := c.Request.Header.Get("Authorization")if tokenString == "" {c.JSON(http.StatusUnauthorized, gin.H{"error": "No token provided"})c.Abort()return}token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {return nil, http.ErrNotSupported}return jwtSecret, nil})if err != nil || !token.Valid {c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"})c.Abort()return}// 令牌有效,继续处理请求c.Next()}
}

6. 测试应用

在项目根目录下运行:

go run cmd/main.go
登录

使用 Postman 或 cURL 发送 POST 请求到 http://localhost:8080/login,请求体示例:

{"username": "testuser","password": "testpassword"
}

如果登录成功,将返回一个 JWT:

{"token": "your_jwt_token"
}
访问受保护的资源

使用返回的 JWT 作为 Authorization 头部的值,发送 GET 请求到 http://localhost:8080/protected/hello

curl -H "Authorization: your_jwt_token" http://localhost:8080/protected/hello

如果 JWT 有效,将返回:

{"message": "Hello, authenticated user!"
}

在这里插入图片描述

总结

这个示例展示了如何在 Gin 框架中实现 JWT 认证,包括用户登录、生成 JWT 和验证 JWT 的中间件。你可以根据需求进行扩展,例如从数据库获取用户信息和密码验证等。


http://www.ppmy.cn/embedded/133688.html

相关文章

openjdk17 hotspot JVM解析class文件

##openjdk17 hotspot JVM解析class文件 ClassFileParser::parse_stream 解析字节码 void ClassFileParser::parse_stream(const ClassFileStream* const stream,TRAPS) {assert(stream ! NULL, "invariant");assert(_class_name ! NULL, "invariant");//…

WebGL进阶(四)-视点和视线

理论基础: 顶点着色器 Vertex Shader 主要是负责处理顶点位置、顶点颜色、顶点向量等顶点的数据;处理一些顶点的变换:例如在进行视图变换和投影变换时MVP矩阵会改变顶点的位置信息。 输入: 顶点着色器输入部分主要是声明&…

Spark SQL DSL

1、 Spark sql -- 代替hive的(并非完全代替) (1) Spark sql 和 hive 区别 : 两者都是写sql的,区别是计算引擎不一样 hive -- 计算引擎是MapReduce ,是通过MR做计算的 Spark sql -- 计算引擎是Saprk Core&#xff…

云腾五洲的智联引擎是什么?

智联引擎是成都云腾五洲科技有限公司旗下的数智化转型服务平台,它提供云边协同的分布式物联网平台引擎服务。这一平台以其强大的功能和灵活性,为全行业提供数智化转型的新动力,帮助企业在数智化升级中实现持续增长。 核心能力 智联引擎的核心…

在面试了些外包以后,我有了些自己的思考

大家好,我是洋子,最近公司在降本增效,需要把外包从北京迁移到陕西的某新一线城市,其实就是变相裁员,减少外包的成本,裁掉现有的员工,重新招聘新人 在整个测试行业,外包测试的比重是…

STM32F103C8T6 IO 操作

1.开启相关时钟 在 STM32 微控制器中,开启 GPIO 端口的时钟是确保 IO 口可以正常工作的第一步。 查找 RCC 寄存器使能时钟 在 STM32 中,时钟控制的寄存器通常位于 RCC (Reset and Clock Control) 模块中。不同的 STM32 系列(如 STM32F1、STM…

【Windows电脑通过cmd命令查看电脑电池健康度】

Cmd输入 powercfg /batteryreport打印电池使用报告,打开即可 此处查看FULL CHARGE CAPACITY(充满电容量)

研二了,该想想做啥呢?

写于22年10月24日,之前删了,今天回看,自己当时还挺有意思哈哈哈 一、自我介绍 行秋,男,24岁,电子信息专业,硕士在读。 二、新学期目标 1、好好学习 ① 学好一门语言,学好英语&am…