📅  最后修改于: 2023-12-03 15:15:22.153000             🧑  作者: Mango
JWT (JSON Web Token) 是一种用于在网络上传递信息的开放标准 (RFC 7519),是一种基于标头(header)、载荷(payload)和签名(signature)三部分组成的令牌,可以用于身份认证和授权。
使用JWT的优势在于,它可以帮助你在不依赖于session和cookie的情况下实现用户身份的验证和授权,这意味着你的API可以变得更加快速和可伸缩。
在Go语言中,有许多JWT库可以使用,其中最常用的是 github.com/dgrijalva/jwt-go。下面我们将演示如何使用该库来创建并验证JWT。
import (
"github.com/dgrijalva/jwt-go"
"time"
)
func CreateJWT() (string, error) {
// 创建一个JWT Claims
claims := jwt.MapClaims{}
claims["authorized"] = true
claims["user_id"] = "123"
claims["exp"] = time.Now().Add(time.Hour * 24).Unix()
// 使用HS256算法签名并返回JWT
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
signedToken, err := token.SignedString([]byte("my_secret_key"))
if err != nil {
return "", err
}
return signedToken, nil
}
这里我们使用了HS256算法对JWT进行签名,并将其有效期设置为一天。签名时需要使用一个密钥,这里我们使用了一个字符串 "my_secret_key"。
import (
"fmt"
"github.com/dgrijalva/jwt-go"
)
func ValidateJWT(tokenString string) (jwt.MapClaims, error) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
}
return []byte("my_secret_key"), nil
})
if err != nil {
return nil, err
}
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
return claims, nil
} else {
return nil, fmt.Errorf("invalid token")
}
}
这里我们使用了 jwt.Parse
方法来验证JWT。如果验证成功,则返回JWT Claims,否则返回错误信息。
使用JWT可以提高API的性能和可扩展性,同时也能更好地保护你的API不被未经授权的用户访问。在Go语言中,使用 github.com/dgrijalva/jwt-go
库可以轻松地创建和验证JWT。