现象

使用gin + jwt-go 做jwt验证的时候,写下如下结构体

type CustomClaims struct {
	Name   string `json:"name"`
	UserId string `json:"userId"`
	// StandardClaims结构体实现了Claims接口(Valid()函数)
	jwt.StandardClaims
}

初始化结构体

func (c *LoginController) generateToken(user entity.User) (string, error) {
	// 构造SignKey: 签名和解签名需要使用一个值
	j := helper.NewJWT()

	// 构造用户claims信息(负荷)
	claims := helper.CustomClaims{
		user.RealName,
		cast.ToString(user.Id),
		jwt.StandardClaims{
			NotBefore: int64(time.Now().Unix() - 1000), // 签名生效时间
			ExpiresAt: int64(time.Now().Unix() + 3600), // 签名过期时间
			Issuer:    "yujinping.top",                 // 签名颁发者
		},
	}

	// 根据claims生成token对象
	token, err := j.CreateToken(claims)

	if err != nil {
		return "", err
	}

	return token, nil

}

此时,就会出现 “composite literal uses unkeyed fields” 这个警告,意思就是应该是用带有key的初始化。

修正如下

默认情况下,如果没有指定Key ,则会用默认的类型作为Key进行初始化。因此修改如下,使用StandardClaims 即可。

func (c *LoginController) generateToken(user entity.User) (string, error) {
	// 构造SignKey: 签名和解签名需要使用一个值
	j := helper.NewJWT()

	// 构造用户claims信息(负荷)
	claims := helper.CustomClaims{
		Name:   user.RealName,
		UserId: cast.ToString(user.Id),
		StandardClaims: jwt.StandardClaims{
			NotBefore: int64(time.Now().Unix() - 1000), // 签名生效时间
			ExpiresAt: int64(time.Now().Unix() + 3600), // 签名过期时间
			Issuer:    "yujinping.top",                 // 签名颁发者
		},
	}

	// 根据claims生成token对象
	token, err := j.CreateToken(claims)

	if err != nil {
		return "", err
	}

	return token, nil

}