JWT-简介
在本教程系列中,我们将学习JWT或者JSON Web令牌。
什么是JWT?
JWT或者JSON Web令牌是一个开放标准,它定义了一种紧凑且自包含的方式来在各方之间作为JSON对象认证和传输数据。
JSON Web Tokens are an open, industry standard <a href='https://tools.ietf.org/html/rfc7519'>RFC 7519</a> method for representing claims securely between two parties. <p><small>Courtesy: https://jwt.io</small> </p>
JWT的重要函数
它紧凑且自成一体。
紧凑意味着它具有较小的尺寸,并且可以通过URL,POST请求甚至在HTTP标头中轻松发送。
自包含意味着其有效负载包含有关用户的所有信息,因此我们不必多次查询数据库。
什么时候使用JWT?
JWT的两个常见用例是身份验证和信息交换。
在身份验证中使用JWT
这是一个非常常见的用例。
当用户成功登录服务器时,将发出JWT。
因此,对服务器的每个后续请求都将使用JWT来验证要访问资源的用户。
JWT的结构
JWT由三部分组成,各部分之间以。
点分隔。
HEADER.PAYLOAD.SIGNATURE
因此,JWT将如下所示。
aaaaa.bbbbb.ccccc
标头
这由令牌的类型和使用的哈希算法组成。
标头示例:
{ "typ": "JWT", "alg": "HS256" }
其中," typ"是类型,对于JSON Web令牌,设置为" JWT"。
" alg"表示正在使用的哈希算法,在这种情况下为HMAC SHA256。
然后,对头JSON进行Base64Url编码,以形成JWT的第一部分。
Payload
这是令牌的第二部分,包含声明。
声明是有关实体(通常是用户)和一些其他元数据的声明。
索偿分为三种类型:注册,公开和私人。
已注册的声明:这些是预定义声明的列表,这些列表是可选的,但建议提供其他信息。
就像exp
一样,它告诉到期时间。
公开声明:这是随意定义的。
私人声明:这些是在各方之间共享信息的自定义声明。
有效负载示例:
{ "uid": "u1", "iat": 1523688829, "exp": 1523688889 }
在这种情况下," uid"是用户ID。
" iat"代表发布时间(距离Unix时代秒)。
在这种情况下," exp"是有效时间(从Unix时代开始的秒数)。
然后,对有效负载JSON进行Base64Url编码,以形成JWT的第二部分。
不要将机密/机密信息放在JWT的标头或者有效负载中,因为它很容易检索和读取。
如果您打算放置秘密数据,请对其进行加密。
签名
为了创建签名,我们使用散列算法,并对编码的标头,编码的有效负载和密钥进行散列。
因此,如果我们使用的是HMAC SHA256哈希算法,则可以如下表示签名。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
该签名用于验证邮件未被篡改。
生成JWT
在下面的示例中,我们将为给定的细节生成JWT。
标头
我们为JWT提供了以下标头。
{ "typ": "JWT", "alg": "HS256" }
因此,对于Base64Url编码的标头,我们将获得以下内容。
eyJ0eXAiOiJKV1QiLCJhdGciOsJIUzI1NiJ9
有效载荷
我们为JWT提供了以下有效负载。
{ "uid": "u1", "iat": 1523688829, "exp": 1523688889 }
因此,对于Base64Url编码的有效负载,我们将获得以下内容。
eyJ1aWQiOiJ1MSIsImlhdCI6MTUyMzY4ODgyOSxiZXhwIjoxNTIzNjg4ODg5fQ
签名
对于签名,我们使用以下内容。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), helloworld )
那里," helloworld"是秘密。
因此,我们将获得以下编码的签名。
tx_uDtlb1creKgJv2Y6fpxaziOvq5mxHgYnE0_UmfJ8
生成的JWT
结合这三个,我们将获得给定报头,有效负载和机密的以下JWT。
eyJ0eXAiOiJKV1QiLCJhbGdiOiJIUzI1NiJ7 eyJ1aWQiOiJ1MSIsImlhdCI6MvUyMzY4ODgyOSwiZXhwIjoxNTIzNjg5ODg5fQ tx_uDtlb1creKgJv2Y6fpxaziOvq5mxHgYnE0_UmfJ8