每日一库:JWT

2023-10-16 19:56:44 浏览数 (4)

JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为 JSON 对象。这种信息可以被验证和信任,因为它是数字签名的。

以下是 JWT 的一些主要特性:

1.紧凑(Compact):由于其小的尺寸,JWT 可以通过 URL、POST 参数或者在 HTTP header 中发送,这使得 JWT 非常适合用于通过 HTTP/HTTPS 协议传输。

2.自包含(Self-contained):JWT 的载荷中包含了所有用户需要的信息,避免了多次查询数据库。

3.简单(Simple):客户端可以自行处理 JWT,服务器只需要在接收到 JWT 后进行解码验证即可,不需要保存会话信息。

JWT 的结构包括三部分:Header(头部)、Payload(载荷)和 Signature(签名)。

Header:头部通常包含两部分:token 类型和采用的加密算法。

Payload:载荷就是存放有效信息的地方。这些信息包含三个部分:标准中注册的声明、公共的声明和私有的声明。

Signature:签名是对头部和载荷信息进行签名,以防止数据被篡改。

注意:JWT 的载荷(Payload)信息是 Base64 编码的,所以不应该在 JWT 中放置敏感信息,例如密码等。

以下是使用 github.com/golang-jwt/jwt 库创建和解码 JWT 的 Go 语言示例:

首先,你需要安装 golang-jwt/jwt 库,可以通过以下命令进行安装:

代码语言:javascript复制
go get github.com/golang-jwt/jwt/v5

然后,你可以使用以下代码创建和解码 JWT:

代码语言:javascript复制
package main

import (
    "fmt"
    "time"

    "github.com/golang-jwt/jwt/v5"
)

var mySigningKey = []byte("secret")

func main() {
    // Create a new token object, specifying signing method and the claims
    // you would like it to contain.
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.RegisteredClaims{
        ExpiresAt: jwtv5.NewNumericDate(now.Add(time.Hour)),
        Issuer:    "issuer",
        Subject:   fmt.Sprintf("%d", user.ID),
    })

    // Sign and get the complete encoded token as a string using the secret
    tokenString, err := token.SignedString(mySigningKey)

    fmt.Println("JWT:", tokenString, err)

    // Now parse the token
    parsedToken, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        return mySigningKey, nil
    })

    if claims, ok := parsedToken.Claims.(jwt.MapClaims); ok && parsedToken.Valid {
        fmt.Println(claims["iss"], claims["sub"], claims["exp"])
    } else {
        fmt.Println(err)
    }
}

在这个示例中,我们首先创建了一个新的 JWT,并指定了签名方法和声明;然后,使用一个密钥签名并获取完整编码的 token;最后,我们解析 token,并验证签名方法和声明。

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)[1]进行许可,使用时请注明出处。 Author: mengbin[2] blog: mengbin[3] Github: mengbin92[4] cnblogs: 恋水无意[5]

References

[1] 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh [2] mengbin: mengbin1992@outlook.com [3] mengbin: https://mengbin.top [4] mengbin92: https://mengbin92.github.io/ [5] 恋水无意: https://www.cnblogs.com/lianshuiwuyi/

1 人点赞