https://segmentfault.com/a/1190000020329813
1.什么是JWT
JWT(JSON Web Token)是一个非常轻巧的规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,
一个JWT由三部分组成,Header头部、Claims载荷、Signature签名,
JWT原理类似我们加盖公章或手写签名的的过程,合同上写了很多条款,不是随便一张纸随便写啥都可以的,必须要一些证明,比如签名,比如盖章,JWT就是通过附加签名,保证传输过来的信息是真的,而不是伪造的,
它将用户信息加密到token里,服务器不保存任何用户信息,服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证,
2.JWT构成
一个JWT由三部分组成,Header头部、Claims载荷、Signature签名,
Header头部:头部,表明类型和加密算法
Claims载荷:声明,即载荷(承载的内容)
Signature签名:签名,这一部分是将header和claims进行base64转码后,并用header中声明的加密算法加盐(secret)后构成,即:
let tmpstr = base64(header)+base64(claims)
let signature = encrypt(tmpstr,secret)
//最后三者用".“连接,即:
let token = base64(header)+”."+base64(claims)+"."+signature
1、Authenticator
old:Authenticator: func(userId string, password string, c *gin.Context)
New:
============================
`` type login struct { Username string `form:"username" json:"username" binding:"required"` Password string `form:"password" json:"password" binding:"required"` } Authenticator: func(c *gin.Context) (interface{}, error) { var loginVals login if err := c.ShouldBind(&loginVals); err != nil { return "", jwt.ErrMissingLoginValues } userID := loginVals.Username password := loginVals.Password `` 2、authMiddleware
old:
authMiddleware := jwt.GinJWTMiddleware{
New:
authMiddleware, err := jwt.New(&jwt.GinJWTMiddleware{
1. Authenticator 回傳的 data
2. data 會丟入到 PayloadFunc
3. PayloadFunc 整理資料寫入 MapClaims
4. Authorizator 再拿 MapClaims 資料出來判斷
新版和舊版有地方不同
type xxxxx struct{
aaaaaaa:string
}
1、
Authenticator: func(userId string, password string, c *gin.Context) (interface{}, bool) {
return xxxxx{aaaaaaa: ooooxxxx} or string
2、
PayloadFunc: func(data interface{}) jwt.MapClaims {
if v, ok := data.(xxxxx); ok {
id = data.(xxxxx).aaaaaaa
}
return jwt.MapClaims{“aaaaaaa”: ooooxxxx, “bbbbbbb”: ooooxxxx}
3、
Authorizator: func(data interface{}, c *gin.Context) bool {