前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日一库:JWT

每日一库:JWT

作者头像
孟斯特
发布2023-10-16 19:56:44
1870
发布2023-10-16 19:56:44
举报
文章被收录于专栏:code人生code人生

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/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 孟斯特 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • References
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档