Golang Gin 中使用 jwt

黑铁小盖伦 · · 727 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

// 可以改成配置方式
var mySigningKey = []byte("AllYourBase")

// MyCustomClaims 定制
type MyCustomClaims struct {
    UserID uint `json:"user_id"`
    jwt.StandardClaims
}

// SignToken 签发 token
func SignToken(userID uint) (string, error) {

    // Create the Claims
    claims := &MyCustomClaims{
        userID,
        jwt.StandardClaims{
            ExpiresAt: time.Now().Add(time.Hour * 2).Unix(),
            Issuer:    "test",
        },
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    return token.SignedString(mySigningKey)
}

// ParseToken 解析 token
func ParseToken(tokenString string) (uint, error) {

    token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
        return mySigningKey, nil
    })

    if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
        fmt.Printf("%v %v", claims.UserID, claims.StandardClaims.ExpiresAt)
        return claims.UserID, nil
    }
    return 0, err

}

// JWTAuth 令牌验证,一般写成 gin 的中间件
func JWTAuth() gin.HandlerFunc {
    return func(c *gin.Context) {
        tokenString := c.Request.Header.Get("Authorization")
        if tokenString == "" {
            c.JSON(http.StatusUnauthorized, gin.H{
                "code": http.StatusUnauthorized,
                "msg":  "Authorization 不能为空",
            })
            c.Abort()
            return
        }
        _, err := utils.ParseToken(tokenString)

        if err != nil {
            c.JSON(http.StatusUnauthorized, gin.H{
                "code": http.StatusUnauthorized,
                "msg":  err.Error(),
            })
            c.Abort()
            return
        }

        c.Next()

        // after request

    }
}

// AdminAuth 角色权限验证,一般写成 gin 的中间件
func AdminAuth() gin.HandlerFunc {
    return func(c *gin.Context) {
        tokenString := c.Request.Header.Get("Authorization")
        if tokenString == "" {
            c.JSON(http.StatusUnauthorized, gin.H{
                "code": http.StatusUnauthorized,
                "msg":  "Authorization 不能为空",
            })
            c.Abort()
            return
        }
        userID, err := utils.ParseToken(tokenString)

        if err != nil {
            c.JSON(http.StatusUnauthorized, gin.H{
                "code": http.StatusUnauthorized,
                "msg":  err.Error(),
            })
            c.Abort()
            return
        }

        user, err := db.GetUserByID(userID)
        if err != nil {
            c.JSON(http.StatusUnauthorized, dto.Response{Message: err.Error()})
            c.Abort()
            return
        }
        if user.AccountType != "ADMIN" {
            c.JSON(http.StatusUnauthorized, dto.Response{Message: "权限不足"})
            c.Abort()
            return
        }
        c.Next()
    }
}



有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:黑铁小盖伦

查看原文:Golang Gin 中使用 jwt

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

727 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传