首页 > 其他分享 >golang之jwt

golang之jwt

时间:2023-06-17 10:06:50浏览次数:51  
标签: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://blog.51cto.com/u_11045899/6504540

相关文章

  • 如何调试golang程序
    在Golang中进行调试和性能分析是非常重要的,在开发过程中发现问题并及时修复可以极大地提高代码质量和效率。介绍两种常用的调试工具,dlv和pprof,以及如何使用它们进行代码调试和性能分析。一、dlv调试工具1.安装在使用dlv前需要先安装,可以通过以下命令进行安装:goget-ugithub.......
  • golang 语法糖
    golang语法糖在Go语言中,nums...是一种语法糖,用于将切片nums展开为一个个独立的参数。在函数调用中,如果你有一个切片nums,你可以使用nums...将切片展开为独立的元素,作为函数的参数传递。以下是一个示例说明nums...的使用:gofuncsum(nums...int)int{total:......
  • 镜像golang 标准库文档
    缘起:查golang文档时,访问https://pkg.go.dev/std网站有点慢,就想做个离线版的修改日期:2023-06-16mirrorstdlibwget-c-t3-r-l1-np-p-khttps://pkg.go.dev/stdstatic/frontend/*rename.css@*->.cssreplacetextbytextforeverhttps://pkg.go.dev.......
  • How Do ASP.NET Core Services Validate JWT Signature Signed by AAD?
    TableofcontentsBackgroundConfigurationHandleAuthenticationValidateTokenSummaryBackgroundIfweneedtouseJWTBearertokensissuedbyAAD(toeitherauserorserviceprincipal)forauthentication,usuallywecanaddbelowcodeto ConfigureSe......
  • JwtToken---Token上下文,负责token的创建和验证
    publicclassJwtToken{///<summary>///秘钥,可以从配置文件中获取///</summary>publicstaticstringsecurityKey="GQDstclechenxxxxxxxxojPOXOYg5MbeJ1XT0uxxxxxxvVBrk";///<summary>///创建jw......
  • golang之数据验证validator
    https://blog.csdn.net/guyan0319/article/details/105918559/前言在web应用中经常会遇到数据验证问题,普通的验证方法比较繁琐,这里介绍一个使用比较多的包validator。原理将验证规则写在struct对字段tag里,再通过反射(reflect)获取struct的tag,实现数据验证。安装gogetgithub.co......
  • golang之context
    context用来解决goroutine之间退出通知、元数据传递的功能。 context使用起来非常方便。源码里对外提供了一个创建根节点context的函数:funcBackground()Context background是一个空的context,它不能被取消,没有值,也没有超时时间。有了根节点context,又提供了......
  • Golang的wire是什么
    Golang的wire是什么了解Golang的wire框架对于构建可维护和可扩展的应用程序至关重要在当今的技术世界中,谷歌的Go语言(Golang)已经成为了许多开发人员的首选语言。Go语言以其简洁性、高效性和并发性而闻名,因此在开发各种类型的应用程序时广受欢迎。随着Go语言的不断发展,出现了许多框......
  • golang之http请求库go-resty
     github: https://github.com/go-resty/resty go-resty特性#go-resty 有很多特性:发起GET,POST,PUT,DELETE,HEAD,PATCH,OPTIONS,etc.请求简单的链式书写自动解析JSON和XML类型的文档上传文件重试功能客户端测试功能RestyclientCustom RootCertif......
  • golang之errors包
    errors包常用方法funcUnwrap(errerror)error//获得err包含下一层错误funcIs(err,targeterror)bool//判断err是否包含targetfuncAs(errerror,targetinterface{})bool//判断err是否为target类型   自定义错误信息err......