在项目中到底应不应该用jwt?

简介: JSON Web Tokens(JWT)是一种开放标准,用于在网络上传输安全信息。它常用于身份验证场景,用户登录后,服务器生成JWT并返回给客户端。客户端在后续请求中携带此令牌,服务器验证其有效性来确认用户身份。JWT具有无状态、可扩展和安全的特点,支持跨域认证,但也有令牌大小、续期复杂等缺点。是否使用JWT取决于项目需求,多数公司在采用,除非有特殊理由避免。以下是Go语言中使用JWT的一个示例。

这几年互联网上各大公司都在用 JWT,那,它到底是什么?我们必须要在自己的项目中用到吗?

JWT是什么

JSON Web Tokens(JWT)是一个开放标准(RFC 7519),它定义了一种用于在网络上表示声明信息的安全令牌格式。

通常用于身份验证和授权场景,通过 JWT 可以安全地传输用户信息,如用户名和用户角色等。一旦用户登录成功,服务器会生成一个包含用户信息的 JWT 并将其返回给客户端。客户端在后续的请求中携带这个令牌,服务器可以验证令牌的有效性以确定请求的来源身份是否合法。这样无需在每个请求中都验证用户凭证。这种认证机制可以提高系统的安全性和效率。

JWT的优点

  1. 无状态和可扩展性:服务端不需要保存会话信息,使得应用易于扩展。
  2. 跨域认证:JWT可以跨越不同的域进行认证,因为它是一个自包含的令牌。
  3. 安全性:JWT可以被签名以确保信息在传输过程中未被篡改。

JWT的缺点

  1. 令牌大小:由于JWT包含了用户信息,可能会影响性能。
  2. 令牌续期:续期机制比较复杂,需要额外的逻辑处理。
  3. 存储安全:需要安全地存储JWT,防止令牌被盗用。
  4. 撤销困难:JWT不支持撤销机制,一旦签发,除非令牌过期,否则无法撤销。

至于在项目中该不该用 JWT?其实这个问题就是仁者见仁,智者见智了,主要还是得看自己项目的实际情况,但是既然这几年大多数公司都在用,如果你没有十足的理由说服自己不去使用,那么我建议你还是使用。

下面给出一个在 Go 语言中使用 JWT 的示例,供各位参考。

Go语言实现JWT

在Go语言中,我们可以使用jwt-go库来实现JWT的生成、解析和验证。以下是一个结合您提供的代码的优化示例:

package jwt

import (
    "errors"
    "github.com/gin-gonic/gin"
    "github.com/golang-jwt/jwt"
    "time"
)

// 密钥和配置相关
const secretKey = "your_secret_key" // 密钥,实际应用中应从配置文件中读取

// JWTCustomClaims 自定义载荷
type JWTCustomClaims struct {
   
    UserID string `json:"user_id"`
    jwt.StandardClaims
}

// NewJWT 实例化JWT
func NewJWT() *JWT {
   
    return &JWT{
   
        Key: []byte(secretKey),
    }
}

// JWT 结构体
type JWT struct {
   
    Key []byte
}

// GenerateToken 生成Token
func (j *JWT) GenerateToken(userID string) (string, error) {
   
    atClaims := &JWTCustomClaims{
   
        UserID: userID,
        StandardClaims: jwt.StandardClaims{
   
            ExpiresAt: time.Now().Add(1 * time.Hour).Unix(),
            Issuer:    "YourApp",
        },
    }
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims)
    return token.SignedString(j.Key)
}

// ParseToken 解析Token
func (j *JWT) ParseToken(tokenString string) (*JWTCustomClaims, error) {
   
    token, err := jwt.ParseWithClaims(tokenString, &JWTCustomClaims{
   }, func(token *jwt.Token) (interface{
   }, error) {
   
        return j.Key, nil
    })
    if err != nil {
   
        return nil, err
    }
    if claims, ok := token.Claims.(*JWTCustomClaims); ok && token.Valid {
   
        return claims, nil
    }
    return nil, errors.New("invalid token")
}

// GetTokenFromContext 从Gin上下文获取Token
func GetTokenFromContext(c *gin.Context) (string, error) {
   
    token := c.Request.Header.Get("Authorization")
    if token == "" {
   
        return "", errors.New("token not found")
    }
    return token, nil
}

使用示例

router := gin.Default()

jwtMiddleware := func(j *JWT) gin.HandlerFunc {
   
    return func(c *gin.Context) {
   
        tokenString, err := GetTokenFromContext(c)
        if err != nil {
   
            c.JSON(200, gin.H{
   "error": "Unauthorized"})
            c.Abort()
            return
        }
        claims, err := j.ParseToken(tokenString)
        if err != nil {
   
            c.JSON(200, gin.H{
   "error": "Invalid token"})
            c.Abort()
            return
        }
        c.Set("claims", claims)
        c.Next()
    }
}

router.Use(jwtMiddleware(NewJWT()))

router.GET("/secure", func(c *gin.Context) {
   
    claims := c.MustGet("claims").(*JWTCustomClaims)
    c.JSON(200, gin.H{
   "message": "Secure data for user", "user_id": claims.UserID})
})

router.Run(":8080")

更完整的示例,建议还是参考 https://github.com/pudongping/gin-biz-web-api/tree/main/pkg/jwt 已经封装好了包,可直接拿到自己项目中使用。

这个示例展示了如何在Go语言的Gin框架中使用JWT进行身份验证。通过中间件jwtMiddleware,我们可以验证每个请求的Token,并将其载荷(Claims)存储在Gin的上下文中,以便后续的处理函数使用。

希望这篇文章和代码示例能够帮助你更好地理解JWT,并在实际项目中应用它。

相关文章
|
6月前
|
存储 JSON JavaScript
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)-1
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)
183 0
|
存储 JSON 算法
Jwt简介+工具类应用+Jwt集成spa项目
Jwt简介+工具类应用+Jwt集成spa项目
295 0
|
XML JSON 前端开发
jwt的使用概念工具类与切入spa项目
jwt的使用概念工具类与切入spa项目
88 0
|
3月前
|
JSON API 数据安全/隐私保护
Django 后端架构开发:JWT 项目实践与Drf版本控制
Django 后端架构开发:JWT 项目实践与Drf版本控制
67 0
|
JSON 前端开发 安全
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)-2
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)
97 0
|
6月前
|
JSON 前端开发 安全
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)-2
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)
114 0
|
11月前
|
JSON 数据格式
jwt->jwt简介,jwt工具类,jwt集进成spa项目
jwt->jwt简介,jwt工具类,jwt集进成spa项目
82 0
|
存储 JSON JavaScript
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)-1
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)
109 0
|
JSON JavaScript 算法
[Vue]之Jwt的入门和Jwt工具类的使用及Jwt集成spa项目
[Vue]之Jwt的入门和Jwt工具类的使用及Jwt集成spa项目
164 0
|
算法 Java 数据安全/隐私保护
微服务轮子项目(20) -JWT的RSA非对称密钥生成
微服务轮子项目(20) -JWT的RSA非对称密钥生成
47 0

热门文章

最新文章