Gin中使用jwt-go实现JWT鉴权登陆
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/golang-jwt/jwt"
"net/http"
"time"
)
var mySigningKey = []byte("AllYourBaseAreBelongToUs")
// 用户结构体
type User struct {
Username string `json:"username"`
Password string `json:"password"`
}
// 登录函数,生成JWT token
func login(c *gin.Context) {
var user User
if c.BindJSON(&user) == nil {
if user.Username == "admin" && user.Password == "admin" {
token := jwt.New(jwt.SigningMethodHS256)
claims := token.Claims.(jwt.MapClaims)
claims["username"] = user.Username
claims["iss"] = "jwt-go-example"
claims["exp"] = time.Now().Add(time.Minute * 1).Unix()
tokenString, _ := token.SignedString(mySigningKey)
c.JSON(http.StatusOK, gin.H{"token": tokenString})
} else {
c.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"})
}
}
}
// 需要鉴权的API
func protected(c *gin.Context) {
// 验证JWT token
var token *jwt.Token
var err error
tokenString := c.Request.Header.Get("token")
if tokenString != "" {
token, err = jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("无效的签名方法")
}
return mySigningKey, nil
})
}
if err != nil || !token.Valid {
c.JSON(http.StatusUnauthorized, gin.H{"error": "无效的JWT token"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "你已经通过鉴权!"})
}
func main() {
r := gin.Default()
// 登录端点
r.POST("/login", login)
// 需要鉴权的API
r.GET("/protected", protected)
r.Run(":8080")
}
这段代码实现了一个简单的登录接口,生成JWT token,以及一个受保护的API,它会验证传入的JWT token。在实际应用中,你需要根据自己的需求对用户验证和JWT token的生成、验证逻辑进行相应的安全加固。
评论已关闭