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(