随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

go使用jwt创建token并验证token的有效性

一、概述

  Go使用jwt创建token,验证登录用户的合法性

  导入jwt包

go get github.com/dgrijalva/jwt-go

 

二、代码示例

  1.创建token及解析token

复制代码
package token

import (
    "fmt"
    "go_workspace/entity"
    "time"

    "github.com/dgrijalva/jwt-go"
)

type Claims struct {
    Id  int64
    Pwd string
    jwt.StandardClaims
}

var jwtKey = []byte("yw_tony_laofuzi_123456789") //证书签名秘钥,用来签发证书

// 生成token
func CreateToken(user entity.User) (string, error) {
    fmt.Println("传给token的用户数据:", user)
    //设置token过期时间(此处设置7天后过期)
    expirationTime := time.Now().Add(7 * 24 * time.Hour)
    claims := &Claims{
        Id:  user.Id,
        Pwd: user.Pwd,
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: expirationTime.Unix(),      //过期事件
            IssuedAt:  time.Now().Unix(),          //发布时间
            Subject:   "go test create jwt token", //主题
            Issuer:    "tony",                     //发布者
        },
    }
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) //生成token
    tokenStr, err := token.SignedString(jwtKey)
    if err != nil {
        fmt.Println("token", tokenStr)
    }
    return tokenStr, err
}

// 解析token
func ParseToken(tokenStr string) (*jwt.Token, *Claims, error) {
    claims := &Claims{}
    token, err := jwt.ParseWithClaims(tokenStr, claims,
        func(token *jwt.Token) (i interface{}, err error) {
            return jwtKey, nil
        })
    return token, claims, err
}
复制代码

  2.登录后创建token

复制代码
// 用户登录
func loginHandler(context *gin.Context) {
    var user entity.User
    err1 := context.ShouldBindJSON(&user)
    if err1 != nil {
        context.JSON(400, gin.H{"error": err1.Error()})
    }
    fmt.Println("登录用户的账号密码信息", user)
    user2, err := model.Login(user)
    if err != nil {
        context.JSON(500, gin.H{"error": err.Error()})
    }
    mToken, err2 := token.CreateToken(user2)
    if err2 != nil {
        context.JSON(500, gin.H{"error": err2.Error()})
    }
    context.JSON(200, gin.H{"token": mToken})
}
复制代码

  3.添加用户后解析token,并验证用户身份

复制代码
func checkToken(context *gin.Context) {
    //获取authorization header
    Authorization := context.GetHeader("Authorization")
    fmt.Println("Authorization:", Authorization)
    if Authorization == "" {
        context.JSON(400, gin.H{"error": "token为空"})
        return
    }
    //解析token
    mToken, claims, err := token.ParseToken(Authorization)
    fmt.Println("token:", mToken)
    fmt.Println("claims:", claims)
    if err != nil || !mToken.Valid { //解析错误或者token过期
        context.JSON(400, gin.H{"error": "token过期/错误"})
        return
    }

}

// 添加新用户
func addUserUseXormHandler(context *gin.Context) {
    checkToken(context)

    var user entity.User
    err5 := context.ShouldBindJSON(&user)
    if err5 != nil {
        context.JSON(400, gin.H{"error": err5.Error()})
        return
    }
    user.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
    row, err1 := model.AddUserUseXorm(user)
    if row > 0 {
        context.JSON(200, gin.H{"data": user})
    } else {
        context.JSON(500, gin.H{"data": err1.Error()})
    }
    fmt.Println("添加新用户")

}
复制代码

 

posted on   飘杨......  阅读(377)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2023-01-12 MediaExtractor+MediaMuxer分离/合成一个新的Mp4
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示