Gin-JWT 开源项目教程
1. 项目的目录结构及介绍
Gin-JWT 项目的目录结构如下:
gin-jwt/
├── LICENSE
├── README.md
├── auth.go
├── auth_test.go
├── example/
│ ├── basic/
│ │ ├── main.go
│ │ └── main_test.go
│ ├── middleware/
│ │ ├── main.go
│ │ └── main_test.go
│ └── refresh_token/
│ ├── main.go
│ └── main_test.go
├── go.mod
├── go.sum
└── middleware.go
目录结构介绍
LICENSE: 项目许可证文件。README.md: 项目说明文档。auth.go和auth_test.go: 包含 JWT 认证的核心逻辑和测试代码。example/: 包含多个示例项目,展示如何使用 Gin-JWT 中间件。basic/: 基础示例。middleware/: 中间件示例。refresh_token/: 刷新令牌示例。
go.mod和go.sum: Go 模块文件,用于管理项目依赖。middleware.go: 包含 Gin-JWT 中间件的实现。
2. 项目的启动文件介绍
项目的启动文件位于 example/ 目录下的各个子目录中。以下是 basic/ 示例的启动文件 main.go 的介绍:
package main
import (
"log"
"net/http"
"time"
"github.com/appleboy/gin-jwt/v2"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
authMiddleware, err := jwt.New(&jwt.GinJWTMiddleware{
Realm: "test zone",
Key: []byte("secret key"),
Timeout: time.Hour,
MaxRefresh: time.Hour * 24,
IdentityKey: "id",
PayloadFunc: func(data interface{}) jwt.MapClaims {
if v, ok := data.(*User); ok {
return jwt.MapClaims{
"id": v.UserName,
}
}
return jwt.MapClaims{}
},
IdentityHandler: func(c *gin.Context) interface{} {
claims := jwt.ExtractClaims(c)
return &User{
UserName: claims["id"].(string),
}
},
Authenticator: func(c *gin.Context) (interface{}, error) {
var loginVals login
if err := c.ShouldBind(&loginVals); err != nil {
return "", jwt.ErrMissingLoginValues
}
userID := loginVals.Username
password := loginVals.Password
if (userID == "admin" && password == "admin") || (userID == "test" && password == "test") {
return &User{
UserName: userID,
LastName: "Bo-Yi",
FirstName: "Wu",
}, nil
}
return nil, jwt.ErrFailedAuthentication
},
Authorizator: func(data interface{}, c *gin.Context) bool {
if v, ok := data.(*User); ok && v.UserName == "admin" {
return true
}
return false
},
Unauthorized: func(c *gin.Context, code int, message string) {
c.JSON(code, gin.H{
"code": code,
"message": message,
})
},
TokenLookup: "header: Authorization, query: token, cookie: jwt",
TokenHeadName: "Bearer",
TimeFunc: time.Now,
})
if err != nil {
log.Fatal("JWT Error:" + err.Error())
}
r.POST("/login", authMiddleware.LoginHandler)
auth := r.Group("/auth")
auth.Use(
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



