gin jwt 使用
时间: 2024-03-02 21:47:20 浏览: 137
在Gin框架中使用JWT(JSON Web Token)可以实现份验证和授权功能。JWT是一种用于在网络应用间传递信息的安全方法,它由三部分组成:header、payload和signature[^1]。
下面是在Gin框架中使用JWT的示例代码[^2]:
1. 导入所需的包:
```go
import (
"github.com/gin-gonic/gin"
"github.com/dgrijalva/jwt-go"
)
```
2. 定义JWT的密钥:
```go
var jwtKey = []byte("your_secret_key")
```
3. 创建一个JWT的Claims结构体,用于存储用户的信息:
```go
type Claims struct {
Username string `json:"username"`
jwt.StandardClaims
}
```
4. 创建一个处理登录请求的路由:
```go
func login(c *gin.Context) {
var loginData LoginData
if err := c.ShouldBindJSON(&loginData); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
return
}
// 验证用户名和密码
if loginData.Username == "admin" && loginData.Password == "password" {
// 创建JWT的Claims
claims := &Claims{
Username: loginData.Username,
StandardClaims: jwt.StandardClaims{
ExpiresAt: time.Now().Add(time.Hour * 24).Unix(), // 设置过期时间
},
}
// 创建JWT
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err := token.SignedString(jwtKey)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to generate token"})
return
}
// 返回JWT给客户端
c.JSON(http.StatusOK, gin.H{"token": tokenString})
} else {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid credentials"})
}
}
```
5. 创建一个需要身份验证的路由:
```go
func protectedRoute(c *gin.Context) {
// 从请求头中获取JWT
authHeader := c.GetHeader("Authorization")
if authHeader == "" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Missing authorization header"})
return
}
// 解析JWT
tokenString := authHeader[7:] // 去除Bearer前缀
claims := &Claims{}
token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
return jwtKey, nil
})
if err != nil {
if err == jwt.ErrSignatureInvalid {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token signature"})
return
}
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid token"})
return
}
if !token.Valid {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"})
return
}
// 验证通过,继续处理请求
c.JSON(http.StatusOK, gin.H{"message": "Protected route"})
}
```
6. 在路由中注册处理函数:
```go
func main() {
r := gin.Default()
r.POST("/login", login)
r.GET("/protected", protectedRoute)
r.Run(":8080")
}
```
以上代码演示了在Gin框架中使用JWT进行身份验证和授权的基本流程。用户可以通过发送登录请求获取JWT,然后在需要身份验证的路由中将JWT放入请求头中进行验证。
阅读全文