初始化项目
自然第一步是暗转
jwt-go
的依赖啦
#go get github.com/golang-jwt/jwt/v5
go get github.com/dgrijalva/jwt-go
加密
一步一步编写程序
- 首先在
main()
函数中写入
package mainimport ("github.com/dgrijalva/jwt-go"
)func main() {//jwt.NewWithClaims(Claims)jwt.NewWithClaims()
}
查看
jwt.NewWithClaims()
函数
Claims基础结构
package mainimport ("github.com/dgrijalva/jwt-go"
)type MyClaims struct {jwt.StandardClaims
}func main() {//jwt.NewWithClaims(Claims)jwt.NewWithClaims()
}
另一个参数–加密方式
package mainimport ("github.com/dgrijalva/jwt-go"
)type MyClaims struct {UserName string `json:"username"`jwt.StandardClaims
}func main() {//jwt.NewWithClaims(加密方式,Claims)jwt.NewWithClaims(jwt.SigningMethodHS256,MyClaims) //当然这里不能是结构体(MyClaims)而是结构体实例
}
关于StandardClaims
type StandardClaims struct {Audience string `json:"aud,omitempty"` //ExpiresAt int64 `json:"exp,omitempty"` //过期时间Id string `json:"jti,omitempty"` //IssuedAt int64 `json:"iat,omitempty"` //Issuer string `json:"iss,omitempty"` //签发人NotBefore int64 `json:"nbf,omitempty"` //什么时间开始生效Subject string `json:"sub,omitempty"` //
}
package mainimport ("fmt""github.com/dgrijalva/jwt-go""time"
)type MyClaims struct {UserName string `json:"username"`jwt.StandardClaims
}func main() {c := MyClaims{UserName: "AllYourBase",StandardClaims: jwt.StandardClaims{NotBefore: time.Now().Unix() - 60, //当前时间的一分钟之前生效ExpiresAt: time.Now().Unix() + 60*60*2, //当前时间的俩小时Issuer: "AllYourBase", //用户名},}//jwt.NewWithClaims(加密方式,Claims)token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)fmt.Println(token)
}
这样我们的token就基本完成了,打印输出
&{ 0xc000008090 map[alg:HS256 typ:JWT] {chen { 1703288998 0 chen 1703296138 }} false}
map[alg:HS256 typ:JWT]
:头
{chen { 1703288998 0 chen 1703296138 }}
:体
0xc000008090
:加密串
我们要丢给前端使用肯定不行,所以要加密
加密部分(token
来自于前面的代码)
mySigningKey := []byte("AllYourBase")
//token.SignedString(key) //key:官方让我们放一个byte
s, err := token.SignedString(mySigningKey)
if err != nil {fmt.Printf("%s", err)
}
fmt.Println(s)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImNoZW4iLCJleHAiOjE3MDMyODk0MzUsImlzcyI6ImNoZW4iLCJuYmYiOjE3MDMyOTY1NzV9.ZeMpAIzPyRoIQSjDctIuQEHxzYRaKQ9McqBfoq3SzCI
生成的这个加密就可以丢给前端去使用了
解密
如果前端吧串丢回来了怎么解密?
jwt.ParseWithClaims(token,解析的模板,func(token *jwt.Token)(interface{},error){})
写法
jwt.ParseWithClaims(s,&MyClaims,func