首页 > 其他分享 >golang之jwt

golang之jwt

时间:2023-06-10 10:33:45浏览次数:46  
标签:secretKey string err jwt golang User claims

golang-jwt是go语言中用来生成和解析jwt的一个第三方库。本文中使用目前最新的v5版本。

安装

go get -u github.com/golang-jwt/jwt/v5

 

在代码中引用

import "github.com/golang-jwt/jwt/v5"

 

结构体

假设jwt原始的payload如下,username,exp为过期时间,nbf为生效时间,iat为签发时间。第一个是业务非敏感参数,后三者为jwt标准的参数。

{
  "username": "zhangsan",
  "exp": 1681869394,
  "nbf": 1681782994,
  "iat": 1681782994
}

 

对此编写结构体,其中jwt.RegisteredClaims包含了expnbfiat三个字段。

type User struct {
    Username string `json:"username"`
    jwt.RegisteredClaims  // v5版本新加的方法
}

 

生成jwt

入参为username和密钥,返回jwt的字符串和error。

func GenerateJWT(username, secretKey string) (string, error){
    claims := User{
        username,
        jwt.RegisteredClaims{
            ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), // 过期时间24小时
            IssuedAt:  jwt.NewNumericDate(time.Now()), // 签发时间
            NotBefore: jwt.NewNumericDate(time.Now()), // 生效时间
        },
    }
    // 使用HS256签名算法
    t := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    s, err := t.SignedString([]byte(secretKey))

    return s, err
}

 

解析jwt

func ParseJwt(tokenstring, secretKey string) (*User, error) {
    t,err := jwt.ParseWithClaims(tokenstring, &User{}, func(token *jwt.Token) (interface{}, error) {
        return []byte(secretKey), nil
    })

    if claims,ok := t.Claims.(*User); ok && t.Valid {
        return claims, nil
    } else {
        return nil,err
    }
}

 

完整示例

package main

import (
    "fmt"
    "os"
    "time"

    "github.com/golang-jwt/jwt/v5"
)

type User struct {
    Username string `json:"username"`
    jwt.RegisteredClaims  // v5版本新加的方法
}

// 生成JWT
func GenerateJWT(username, secretKey string) (string, error) {
    claims := User{
        username,
        jwt.RegisteredClaims{
            ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), // 过期时间24小时
            IssuedAt:  jwt.NewNumericDate(time.Now()), // 签发时间
            NotBefore: jwt.NewNumericDate(time.Now()), // 生效时间
        },
    }
    // 使用HS256签名算法
    t := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    s, err := t.SignedString([]byte(secretKey))

    return s, err
}

// 解析JWT
func ParseJwt(tokenstring, secretKey string) (*User, error) {
    t,err := jwt.ParseWithClaims(tokenstring, &User{}, func(token *jwt.Token) (interface{}, error) {
        return []byte(secretKey), nil
    })

    if claims,ok := t.Claims.(*User); ok && t.Valid {
        return claims, nil
    } else {
        return nil,err
    }
}

func main() {
    var secretKey string = "qwertyuiop"
    s, err := GenerateJWT("zhangsan", secretKey)
    if err != nil {
        fmt.Println("generate jwt failed, ", err)
        os.Exit(1)
    }
    fmt.Printf("%s\n", s)
    
    // 解析jwt
    claims, err := ParseJwt(s, secretKey)
    if err != nil {
        fmt.Println("parse jwt failed, ", err)
        os.Exit(1)
    }
    fmt.Printf("%+v\n", claims)
}

 

参考

标签:secretKey,string,err,jwt,golang,User,claims
From: https://www.cnblogs.com/xingxia/p/golang_jwt5.html

相关文章

  • SpringCloud中实现全局过滤器JWT校验
    思路图思路分析用户进入网关开始登陆,网关过滤器进行判断,如果是登录,则路由到后台管理微服务进行登录用户登录成功,后台管理微服务签发JWTTOKEN信息返回给用户用户再次进入网关开始访问,网关过滤器接收用户携带的TOKEN网关过滤器解析TOKEN,判断是否有权限,如果有,则放行,如果没有......
  • golang实现设计模式汇总-创建型 | 结构型 | 行为型
    历时一个多星期的常用设计模式暂告一段落,今天汇总下使用频率较高的几种常见设计模式。以下个人根据类型分为3种,不喜勿喷:创建型结构型行为型1.创建型常用如下:单例模式简单工厂模式工厂模式抽象工厂模式建造者模式2.结构型常用如下:装饰器模式代理模式组合模式......
  • golang实现设计模式之装饰器模式-优缺点,适用场景
    装饰器模式是一种结构型设计模式,简单概括就是:不改变先有对象结构下,动态给对象增加一些职责。装饰器模式通过组合方式实现,与继承的异同:使用继承方式,具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。使用组合方式,创建装饰对象来装饰真实对象,原对象功能不变,另外扩展。......
  • golang实现设计模式之组合模式-优缺点与适用场景
    组合模式是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。结构抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件......
  • golang实现设计模式之代理模式-优缺点,适用场景
    代理模式作为一种结构型的设计模式,因为某种原因,需要对访问的对象通过代理访问目标对象,访问对象不适合或者不能直接引用该目标对象,代理就成为访问对象和目标对象的中介。结构1.抽象主题(Subject)类。通过接口或抽象类声明真实主题和代理对象实现的业务方法。2.真实主题(RealSubje......
  • golang实现设计模式之责任链模式-优缺点,适用场景
    责任链模式是一种行为型的设计模式,也叫职责链,定义:在这样的场景中,请求需要经过一系列的处理者,通过列表或者链表将处理者组合起来,请求依次被处理者处理,如果需要中断,也可以及时退出处理。上述的这种的应用场景,典型的就是在web应用中的中间件或者拦截器,比如Gin框架的中间件。结......
  • golang实现设计模式之策略模式-优缺点,适用场景
    策略模式是一种行为型的设计模式,该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户,或者认为把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。结构1.抽象策略(Strategy)类。定义了一个公共接口,各种不......
  • golang实现设计模式之适配器模式-优缺点,适用场景
    适配器模式是一种结构型设计模式,它是通过接口转换,使得原先接口不被兼容的其他类可以一起工作。类型类结构型特点:-程序耦合性高-要求程序员对组件内部结构熟悉-应用相对少些类适配器模式可以用过继承的方式来实现。对象结构型特点:可重用性较差。对象适配器允许一......
  • golang实现设计模式之观察者模式-优缺点,适用场景
    观察者模式是一种行为型模式,其定义一种订阅机制,可在对象事件发生时通知多个“观察”该对象的其他对象。观察者模式常用订阅/发布机制,即发布者持有所有订阅者,当发布者状态变更或者特定行为时,通知所有订阅者。结构1.发布者。属性及行为:属性,订阅者列表,行为,添加、删除订阅者方......
  • golang实现设计模式之模板模式-优缺点,适用场景
    模板模式是一种行为型设计模式,其定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。特点1.算法结构已确定。2.具体实现交由子类实现。结构1.抽象类(AbstractClass)。算法步骤可以被声明为抽......