参考资料

  1. https://www.liwenzhou.com/posts/Go/jwt_in_gin/ -李文周博客

什么是jwt?

https://www.yuque.com/u21069870/zwrbcf/rmf7r3#iB9bb

第三方库

go get github.com/dgrijalva/jwt-go


生成JWT

自定义jwt结构

  1. // MyClaims 定义了jwt的数据结构
  2. type MyClaims struct {
  3. UserId int64 `json:"user_id"`
  4. UserName string `json:"username"`
  5. jwt.StandardClaims
  6. }

�定义私钥

  1. var mySecret = []byte("富贵猪爱吃鱼")

JWT生成

  1. // GenToken 用于生成JWT
  2. func GenToken(username string) (string, error) {
  3. // 创建jwt声明(token的payload)
  4. c := MyClaims{
  5. // 自定义字段
  6. UserId,
  7. UserName,
  8. // 标准jwt字段
  9. jwt.StandardClaims{
  10. ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 过期时间
  11. Issuer: "my-project", // 签发人
  12. },
  13. }
  14. // 使用指定签名算法创建签名对象(token的signature)
  15. token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
  16. // 使用自定义的secret签名并获得完整的token
  17. return token.SignedString(MySecret)
  18. }

解析JWT

  1. // ParseToken 用于解析JWT
  2. func ParseToken(tokenString string) (*MyClaims, error) {
  3. // 解析token
  4. token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (i interface{}, err error) {
  5. return MySecret, nil
  6. })
  7. if err != nil {
  8. return nil, err
  9. }
  10. if claims, ok := token.Claims.(*MyClaims); ok && token.Valid { // 校验token
  11. return claims, nil
  12. }
  13. return nil, errors.New("invalid token")
  14. }