Golang 实现 JWT 身份验证
前言
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用间安全地传输声明。它可以通过数字签名或加密保证声明的完整性,并且通常会被用来在用户和服务器之间传递身份信息。在 Golang 中,通过使用第三方库可以轻松地实现 JWT 的生成、签名和验证功能。本文将介绍如何使用 Golang 实现 JWT 的基本功能,并提供了一个简单的示例代码。
什么是 JWT
JWT 是由三个部分组成的字符串,它们以点分隔开:
- Header(头部):包含了 Token 的元数据,例如类型(JWT)和所使用的算法(例如 HMAC SHA256 或 RSA)。
- Payload(载荷):包含了声明(claim),声明是关于实体(通常是用户)和其他数据的一些声明性的信息。
- Signature(签名):使用密钥对 Header 和 Payload 进行签名,以确保数据的完整性。
JWT 通常被用来在身份验证和信息交换方面进行安全的传输。它的优点包括易于传输、自包含、易于解析和使用。
在 Golang 中使用 JWT
在 Golang 中,我们可以使用第三方库来方便地实现 JWT 的生成、签名和验证功能。在本文中,我们将使用 github.com/golang-jwt/jwt/v5
这个库来实现。
首先,我们需要导入该库:
import (
"fmt"
"time"
jwt "github.com/golang-jwt/jwt/v5"
)
接下来,我们定义一个结构体 JWTInstance
,用于初始化 JWT 实例并存储密钥:
type JWTInstance struct {
SecretKey []byte
}
然后,我们实现初始化 JWT 实例和生成 JWT 的方法:
func InitJwt(SecretKey []byte) JWTInstance {
return JWTInstance{SecretKey}
}
// GenerateJWT 生成JWT
func (that JWTInstance) GenerateJWT(username string, count time.Duration) string {
// 创建一个新的JWT token
jwtToken := jwt.New(jwt.SigningMethodHS256)
// 设置一些声明
claims := jwtToken.Claims.(jwt.MapClaims)
claims["username"] = username
claims["exp"] = time.Now().Add(time.Hour * count).Unix()
// 设置签名并获取token字符串
token, err := jwtToken.SignedString(that.SecretKey)
if err != nil {
return ""
}
return token
}
最后,我们实现解析 JWT 的方法:
// ParseJWT 解析JWT
func (that JWTInstance) ParseJWT(tokenString string) jwt.MapClaims {
// 解析JWT字符串
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return that.SecretKey, nil
})
if err != nil {
return nil
}
// 验证token
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
return claims
}
return nil
}
示例代码
下面是一个简单的示例代码,演示了如何初始化 JWT 实例并生成、解析 JWT:
func TestJwt() {
jwt := InitJwt([]byte("2024/3/23"))
token := jwt.GenerateJWT("example_user", 24) // 生成有效期为24小时的 JWT
fmt.Println(token)
claims := jwt.ParseJWT(token)
fmt.Println(claims)
}
结论
在本文中,我们介绍了 JWT 的基本概念以及在 Golang 中使用第三方库实现 JWT 的方法。通过使用 JWT,我们可以在网络应用间安全地传输声明,并实现身份验证和信息交换功能。在实际开发中,可以根据需求对 JWT 进行定制化的配置和使用,以满足具体的业务需求。
转载自:https://juejin.cn/post/7349119682002337792