golang jwt 解析过期信息

golang 下解析 jwt 信息,基本上都用的这个包. https://github.com/dgrijalva/jwt-go

官方的 GitHub 案例,也提供了简单的解析方法:

import "github.com/dgrijalva/jwt-go"

func ParseToken(token string) (*Claims, error) {
  tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) {
    return jwtSecret, nil
  })

  if tokenClaims != nil {
    if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid {
      return claims, nil
    }
  }

  return nil, err
}

ParseWithClaims方 法里会对token做验证,只有验证通过的才会进行后续的逻辑。

但对于已经过期的信息,验证显然是不能通过的,使用这个方法会抛出 get claim is nil 的错误。这时候应该使用 ParseUnverified 方法 跳过验证.

func GetUsernameFromToken(cookie string) (string, error) {
  token, _, err := new(jwt.Parser).ParseUnverified(cookie, jwt.MapClaims{})
  if err != nil {
    return "", err
  }

  if claims, ok := token.Claims.(jwt.MapClaims); ok {
    jwtToken := KeluJwtToken{}
    tmp, err := json.Marshal(claims)
    if err != nil {
      return "", err
    }

    err = json.Unmarshal(tmp, &jwtToken)
    if err != nil {
      return "", err
    }
    return jwtToken.Username, nil
  }

  return "", errors.New("cannot parase cookie")
}

参考资料


golang 解析 map[string]interface{} 和 json 到 struct 一个简单的 gin websocket 例子