怎么使用JWT? | 青训营
作者:LoHhhha 时间:2023.8.22
前言
在进行后端开发时,我们为了使接口需要授权访问,我们应该需要一个Token来验证我们用户的身份来决定接口是否可以为用户服务。若没有Token或其他手段来完成对用户的鉴权,当接口暴露时,将会对整个后端系统造成不可估量的危险。
什么是JWT?
JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
其可以满足Authorization (授权)、Information Exchange (信息交换)场景的需求。
其由以下几部分组成:
- Header
- Payload
- Signature
有什么优势?
- 时效性:可验证是否过期
- 不可篡改性:存在签名完成对信息的保护
怎么在GO使用JWT?
-
导入对应的包
"github.com/golang-jwt/jwt" -
新建结构体
此处我们假设我们的这个
token我们存储的是用户的id与name,我们可以从一个得到的token中得到我们用户的这两个信息,根据自己的需求,可以更改此处的结构。type Claims struct { Id int64 Name string jwt.StandardClaims }
-
指定发行商、私钥
根据自己的情况定。
var issuer = "DouYin" var key = "lohhhha"
-
新建一个
JWT利用用户的
id与name,得到我们想要的token。注意下面代码的
expireTime为过期时间,我们将生成时间加上7 * 24 * time.Hour即为在7天后过期,这里可以根据自己的需求修改。// GetToken // @param: id(int64), name(string) // @return: token(string), err(error) func GetToken(id int64, name string) (string, error) { nowTime := time.Now() expireTime := nowTime.Add(7 * 24 * time.Hour) claims := Claims{ Id: id, Name: name, StandardClaims: jwt.StandardClaims{ ExpiresAt: expireTime.Unix(), Issuer: issuer, }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) tokenString, err := token.SignedString([]byte(key)) if err != nil { return "", err } return tokenString, nil }
-
验证一个
JWT我们将验证
JWT是否过期以及是否可以用我们给出的私钥解密,从此完成了对JWT的验证及信息的获取。// ParseToken // @param: token(string) // @return: claims(*Claims), err(error) // When token invalid return nil, err. // such as token was out-of-date func ParseToken(tokenString string) (*Claims, error) { claims := &Claims{} token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) { // check str`s SigningMethod if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return []byte(key), nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(*Claims); ok && token.Valid { return claims, nil } else { return nil, fmt.Errorf("invalid token") } }