-
依赖
go get github.com/dgrijalva/jwt-go
-
代码
package main import ( "fmt" "net/http" "strconv" "time" "github.com/dgrijalva/jwt-go" "github.com/gin-gonic/gin" ) type User struct { Id int `json:"id"` Name string `json:"name"` Phone string `json:"phone"` Password string `json:"password"` } // 定义StandardClaims type MyClaims struct { UserId int jwt.StandardClaims } var secret = []byte("secret_aabbcc") // 密钥 密钥如果泄露 用户就可以伪造token func main() { engine := gin.Default() engine.POST("create", createHandler) engine.GET("check", checkHandler) engine.Run(":9003") } func checkHandler(c *gin.Context) { // 获取页面jwt和用户id tokenStr := c.Query("jwt") userId := c.Query("id") id, _ := strconv.Atoi(userId) // 将用户id转int类型 fmt.Println("token验证.....", userId, tokenStr) if len(tokenStr) == 0 || id == 0 { c.JSON(http.StatusInternalServerError, "jwt/userId为空") return } token, claims, err := checkJwt(tokenStr) if err != nil || !token.Valid { c.JSON(http.StatusInternalServerError, "token无效或已过期") return } // 判断用户id解析的是否一样 if !(id == claims.UserId) { c.JSON(http.StatusInternalServerError, "用户不存在") return } c.JSON(http.StatusOK, "验证成功") } func createHandler(c *gin.Context) { var user User c.Bind(&user) fmt.Println("登陆....", user) if user.Id == 0 || user.Phone == "" || user.Password == "" { c.JSON(http.StatusInternalServerError, "id/phone/password为空") return } // 判断手机号和验证码是否正确 if user.Phone == "13111111111" && user.Password == "1234" { token, err := createJwt(user.Id) if err != nil { c.JSON(http.StatusInternalServerError, "生成token失败") return } c.JSON(http.StatusOK, token) return } c.JSON(http.StatusInternalServerError, "登陆失败") return } // 检查token func checkJwt(tokenStr string) (*jwt.Token, *MyClaims, error) { claims := &MyClaims{} token, err := jwt.ParseWithClaims(tokenStr, claims, func(token *jwt.Token) (i interface{}, e error) { return secret, nil }) return token, claims, err } // 创建token func createJwt(userId int) (string, error) { // 1、设置token参数 expiresTime := time.Now().Add(7 * 24 * time.Hour) // 设置token过期时间为7天后 claims := &MyClaims{ UserId: userId, StandardClaims: jwt.StandardClaims{ ExpiresAt: expiresTime.Unix(), // 过期时间 IssuedAt: time.Now().Unix(), // 生成时间 Subject: "loginJwt", // 主题 Issuer: "wxb", // 发布者 }, } // 2、创建token对象 token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) // 3、根据密钥生成token字符串 tokenStr, err := token.SignedString(secret) if err != nil { fmt.Println("生成失败", tokenStr) return "", err } return tokenStr, nil }
-
测试
验证jwt
生成jwt
-
RSA方式
-
ECDSA方式