gin实现jwt注册登录

举报
yd_254179665 发表于 2025/07/22 10:28:06 2025/07/22
【摘要】 首先,确保安装了所需的依赖库:go get github.com/gin-gonic/gingo get -u github.com/golang-jwt/jwt/v5go get -u gorm.io/gormgo get -u gorm.io/driver/mysql然后实现JWT Token认证package modelsimport ( "gorm.io/gorm" "g...

首先,确保安装了所需的依赖库:

go get github.com/gin-gonic/gin
go get -u github.com/golang-jwt/jwt/v5
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

然后实现JWT Token认证

package models

import (
    "gorm.io/gorm"
    "github.com/golang-jwt/jwt/v5"
)

type Claim struct {
    gorm.Model
    jwt.RegisteredClaims
}

var Msk []byte = []byte("nbyyyds666") // 加密串
编译获取Token的函数
func GetToken(b []byte, c uint) (string, error) {
    a := Claim{
        gorm.Model{
            ID: c,
        },
        jwt.RegisteredClaims{
            ExpiresAt: jwt.NewNumericDate(time.Now().Add(30 * 24 * time.Hour)), // 过期时间
            Issuer:    "nb", // 签发人
        },
    }
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, a)
    return token.SignedString(b)
}
编译解析Token的函数
func ParseToken(a string) (*jwt.Token, *Claim, error) {
    claim := &Claim{}
    t, err := jwt.ParseWithClaims(a, claim, func(t *jwt.Token) (interface{}, error) {
        return Msk, nil
    })
    return t, claim, err
}
 定义用户表结构
type User struct {
    gorm.Model
    Openid string
    Role   int
}
func GetDB() *gorm.DB {
    dsn := "root:1234@tcp(127.0.0.1:3306)/database?charset=utf8&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        fmt.Println(err)
        return nil
    }
    return db
}
实现JWT中间件
func Mid() gin.HandlerFunc {
    return func(ctx *gin.Context) {
        t := ctx.GetHeader("Authorization")
        if t == "" || !strings.HasPrefix(t, "Bearer ") {
            ctx.JSON(401, gin.H{"message": "解析失败"})
            ctx.Abort()
            return
        }
        t = t[7:] // 去掉头部
        tk, c, e := ParseToken(t)
        if e != nil || !tk.Valid {
            ctx.JSON(401, gin.H{"message": "解析失败1"})
            ctx.Abort()
            return
        }
        Uid := c.Model.ID
        db := GetDB()
        var user4 User
        db.Where("ID=?", Uid).First(&user4)
        if user4.ID == 0 {
            ctx.JSON(401, gin.H{"message": "没有该用户"})
            ctx.Abort()
            return
        }
        ctx.Set("user", user4)
        ctx.Next()
    }
}
注册函数
func Register(c *gin.Context) {
    var user User
    if err := c.ShouldBindJSON(&user); err != nil {
        c.JSON(400, gin.H{"message": "无效的请求"})
        return
    }
    db := GetDB()
    if err := db.Create(&user).Error; err != nil {
        c.JSON(500, gin.H{"message": "注册失败"})
        return
    }
    c.JSON(200, gin.H{"message": "注册成功"})
}
登录函数
func Login(c *gin.Context) {
    var user User
    if err := c.ShouldBindJSON(&user); err != nil {
        c.JSON(400, gin.H{"message": "无效的请求"})
        return
    }
    db := GetDB()
    var existingUser User
    if err := db.Where("openid = ?", user.Openid).First(&existingUser).Error; err != nil {
        c.JSON(400, gin.H{"message": "用户不存在"})
        return
    }
    str, err := GetToken(Msk, existingUser.ID)
    if err != nil {
        c.JSON(500, gin.H{"message": "加密失败"})
        return
    }
    c.JSON(200, gin.H{
        "token":   str,
        "message": "登录成功",
    })
}

主函数

func main() {
    r := gin.Default()

    r.POST("/register", Register)
    r.POST("/login", Login)

    r.GET("/protected", Mid(), func(c *gin.Context) {
        user := c.MustGet("user").(User)
        c.JSON(200, gin.H{
            "message": "受保护的资源",
            "user":    user,
        })
    })

    r.Run(":8080")
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。