📌  相关文章
📜  golang jwt - Go 编程语言(1)

📅  最后修改于: 2023-12-03 15:15:22.153000             🧑  作者: Mango

Golang JWT - Go 编程语言

什么是 JWT?

JWT (JSON Web Token) 是一种用于在网络上传递信息的开放标准 (RFC 7519),是一种基于标头(header)、载荷(payload)和签名(signature)三部分组成的令牌,可以用于身份认证和授权。

JWT的优势

使用JWT的优势在于,它可以帮助你在不依赖于session和cookie的情况下实现用户身份的验证和授权,这意味着你的API可以变得更加快速和可伸缩。

如何在Golang中使用JWT?

在Go语言中,有许多JWT库可以使用,其中最常用的是 github.com/dgrijalva/jwt-go。下面我们将演示如何使用该库来创建并验证JWT。

创建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"。

验证JWT
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。