jwt-go 学习笔记
相关依赖
import "github.com/dgrijalva/jwt-go"
创建一个新项目进行引入
package main
import (
"fmt"
"github.com/dgrijalva/jwt-go"
"time"
)
// 创建一个claims结构体作为参数
type MyClaims struct {
Username string `json:"username"`
jwt.StandardClaims // 继承Claims
}
func main() {
/**
MapCLaims map
StandardCliams struct
加密方式工作中一般用RS256
*/
c := MyClaims{
Username: "张三",
StandardClaims: jwt.StandardClaims{
NotBefore: time.Now().Unix() - 60, // 开始时间
ExpiresAt: time.Now().Unix() + 60 * 60 * 2, // 期限
Issuer: "张三", // 签发人
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
mySigningKey := []byte("sauidhauihauihdiuah") // 加密密钥
s, err := token.SignedString(mySigningKey) // 对token进行加密
if err != nil {
fmt.Printf("%s", err)
}
fmt.Println(s)
}
运行结果如下
解析jwt的信息
// 解析jwt
token, err = jwt.ParseWithClaims(s, &MyClaims{}, func(token *jwt.Token) (interface{}, error) {
return mySigningKey, nil
})
fmt.Println(err)
fmt.Println(token)
结果如下
可以看到err为nil,说明解析成功
而解析出的字符串为:
&{eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VybmFtZSI6IuW8oOS4iSIsImV4cCI6MTYzNDQ5MTU0NywiaXNzIjoi5byg5LiJIiwibmJmIjoxNjM0NDg0Mjg3fQ.X5q1PPsus-ToZwczpHmizcDguLfEGupRFoyRODB2KPg 0xc00000e090 map[alg:HS256 typ:JWT] 0xc000094150 X5q1PPsus-ToZwczpHmizcDguLfEGupRFoyRODB2KPg true}
进一步解析jwt
fmt.Println(token.Claims)
结果为
取出其中的字段
fmt.Println(token.Claims.(*MyClaims).Username)
MapClaims
除了使用自定义的Claims也可以使用官方提供的Claims
使用官方提供的claims新建jwt:
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"username": "张三",
"nbf": time.Now().Unix() - 60, // 开始时间
"exp": time.Now().Unix() + 60 * 60 * 2, // 期限
"iss": "张三", // 签发人
})
然后也可以对其解析
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"username": "张三",
"nbf": time.Now().Unix() - 60, // 开始时间
"exp": time.Now().Unix() + 60 * 60 * 2, // 期限
"iss": "张三", // 签发人
})
mySigningKey := []byte("sauidhauihauihdiuah") // 加密密钥
s, err := token.SignedString(mySigningKey) // 对token进行加密
// 解析jwt
token, err = jwt.ParseWithClaims(s, &jwt.MapClaims{}, func(token *jwt.Token) (interface{}, error) {
return mySigningKey, nil
})
if err != nil {
fmt.Println(err)
}
fmt.Println(token.Claims)
可以看到打印结果为一个map
取出其中每一项
userMap := *token.Claims.(*jwt.MapClaims)
for _, val := range userMap {
fmt.Println(val)
}
结果如下
本文作者:七つ一旋桜
本文链接:https://www.cnblogs.com/poifa/p/15391494.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步