欢迎大家来到IT世界,在知识的湖畔探索吧!
道可道,非常道;名可名,非常名。
无,名天地之始;有,名万物之母。
故常无,欲以观其妙;常有,欲以观其徼。
此两者,同出而异名,同谓之玄。玄之又玄,众妙之门。
此两者,同出而异名,同谓之玄。玄之又玄,众妙之门。
文章导航
欢迎大家来到IT世界,在知识的湖畔探索吧!
贾明是一个酒馆的会员,当他每次光顾的时候,店里会根据贾明的会员卡进行相应的折扣和优惠。
什么是JWT
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在不同实体之间安全地传输信息。它是一种基于 JSON 的轻量级令牌,通常用于身份验证和授权机制。在上面故事里,可以将会员卡理解为JWT。
JWT 由三个部分组成:头部(Header)、载荷(Payload)和签名(Signature)。每个部分都使用 Base64 编码,并使用句点(.)连接起来。具体结构如下:
header.payload.signature
欢迎大家来到IT世界,在知识的湖畔探索吧!
- 头部(Header):包含 JWT 的类型(例如,”typ”: “JWT”)和所使用的算法(例如,”alg”: “HS256″)。这些字段提供了关于 JWT 的元数据。
- 载荷(Payload):存储实际的用户数据或声明。它包含一组称为声明(Claims)的属性,可以自定义添加一些标准声明(如过期时间、发行人等)或自定义声明。载荷中的声明可以被加密,但通常是以明文形式存在。
- 签名(Signature):用于验证消息的完整性和真实性。签名是通过将头部和载荷与一个秘密密钥进行加密生成的,确保 JWT 没有被篡改过。
单纯看概念,可能有点懵,接下来看一个具体的JWT
欢迎大家来到IT世界,在知识的湖畔探索吧!eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
根据颜色标识,分别是三段加密字符串,解析如下。
JWT结构
对于已签名的令牌,此信息虽然受到防止篡改的保护,但任何人都可以读取。除非加密,否则不要在JWT的有效负载或报头元素中放置秘密信息。
工作流程
在使用过程中,客户端使用凭证向认证服务器认证,并由认证服务器返回JWT,后续请求中,客户端携带该JWT,服务端通过验证并解析。
JWT工作流程
- 用户使用凭证(如用户名和密码)进行认证。
- 认证服务器验证用户凭证,生成 JWT 并将其返回给客户端。
- 客户端将 JWT 存储在本地(通常是在客户端的 Cookie 或本地存储中)。
- 在后续的请求中,客户端将 JWT 附加到请求的头部或参数中。
- 服务器验证 JWT 的签名,并从中提取出用户的身份信息。
看到这里,是不是和文章开头的故事很相似,贾明出示会员卡,店里根据会员卡从会员系统校验会员的信息。认证通过之后,贾明就可以享受相应的会员权益。
JWT的创建与校验
JWT与语言无关,因此有广泛的使用,现在我们以Golang为例,来看下JWT的创建与校验。
JWT创建
func GenerateJWT() (string, error) { // 创建一个新的令牌对象 token := jwt.New(jwt.SigningMethodHS256) // 设置一些标准声明(例如过期时间和发行人) claims := token.Claims.(jwt.MapClaims) claims["exp"] = time.Now().Add(time.Hour * 24).Unix() // 设置过期时间为 24 小时后 claims["iss"] = "your_issuer" // 设置发行人 // 添加自定义声明(如果有需要的话) claims["custom_key"] = "custom_value" // 设置签名密钥 secretKey := []byte("your_secret_key") // 这是你的密钥,请根据实际情况进行更改 tokenString, err := token.SignedString(secretKey) if err != nil { return "", err } return tokenString, nil }
- 首先,创建一个新的 JWT 对象,使用 jwt.New 函数并指定签名方法为 HS256。
- 其次,设置一些标准声明(如过期时间和发行人)和自定义声明(如果有需要的话),将它们添加到 JWT 的 Claims 中。
- 接下来,我们通过调用 SignedString 方法并传递签名密钥来对令牌进行签名。
- 最后,返回生成的 JWT 字符串。
JWT校验
欢迎大家来到IT世界,在知识的湖畔探索吧!func ValidateJWT(tokenString string) (bool, error) { // 解析 JWT token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { // 验证签名密钥 secretKey := []byte("your_secret_key") // 这是你的密钥,请根据实际情况进行更改 return secretKey, nil }) if err != nil { return false, err } // 验证是否有效 if _, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return true, nil } return false, nil }
- 首先,使用 jwt.Parse 函数解析传入的 JWT 字符串。在解析过程中,我们还提供了一个回调函数,用于验证签名密钥。
- 在回调函数中,我们简单地返回事先设置好的签名密钥。
- 解析后,检查 JWT 是否有效且签名正确。校验通过,则返回 true 表示校验通过;否则,返回 false。
注意,这里只是简单地检查 JWT 的有效性,实际使用过程中,还需要进一步校验数据的合法性等。
看到这里,聪明的你一定想到,既然JWT有时效性,那么过期后要怎么处理?后续将推出JWT续签的几种方法,和续签过程可能出现的问题。关注本公众号并星标,以便及时得到推送!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/103241.html