JWT-简介

时间:2020-02-23 14:46:18  来源:igfitidea点击:

在本教程系列中,我们将学习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