JWT 认证

JSON 网络令牌(JWT)是一种紧凑的声明表示格式,适用于空间受限的环境,如 HTTP 授权标头和 URI 查询参数。 声明表示为包含 "声明名称" 和 "声明值" 的 "名称/值" 对。

JWT 中的声明编码为 JSON 对象,该对象用作 JSON Web 签名 (JWS) 结构的有效内容,或用作 JSON Web 加密 (JWE) 结构的纯文本。 JWT 声明可以通过消息认证代码 (MAC) 进行数字签名或完整性保护,并且还可以对其进行加密。

JWT 概述

JWT 将一组声明表示为以 JWS 或 JWE 结构编码的 JSON 对象。 此 JSON 对象是 JWT 声明集。 JSON 对象由零个或多个 "名称/值" 对 (或成员) 组成,其中名称是字符串,值是任意 JSON 值。 这些成员是 JWT 表示的声明。 JWT 声明集中的成员名称为 "声明名称"。 相应的值称为 "声明值"。

JWT 表示为一系列 URL部分,以句点('.')字符分隔。 每个部分都包含一个 base64url-encoded值。 JWT 中的部件数取决于生成的 JWS (使用 JWS 压缩序列化) 或 JWE (使用 JWE 压缩序列化) 的表示。

JWT 的类型

JWT 主要有以下两种类型:
  • JSON Web 签名 (JWS) -此类型 JWT 的内容将进行数字签名,以确保 JWT 的内容不会在发送方与接收方之间的传输过程中被篡改。 其他各方也可能可以读取 JWS 的内容或声明。 因此,可以使用 JWS 来验证内容或声明的完整性,但不应将其用于传输敏感数据 (如密码)。 JWS 通常在 HTTPS 或 SSL 上使用,因为它本身不会阻止数据被读取。
  • JSON Web Encryption (JWE) -此类型的 JWT 的内容以数字方式加密。 这意味着它可以用于验证完整性和保护内容。 它可以在普通 HTTP 上使用,因为它本身就对内容进行了加密。
注: Sterling™ Order Management仅支持 JWS。

JWT 示例

典型的 JWS 格式为:<Base 64 URL 编码的 Header json>.<Base 64 URK 编码的 Payload json>.<Base 64 URL 编码的签名>

以下签名是通过使用 RS256 算法,用加密密钥对 Base 64 URL 编码的标头和有效载荷内容进行签名获得的。
Header 
{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "a1"
}

Payload
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "iat": 1516239022,
  "exp": 1531762065
}
下图是使用 RS256 专用密钥签名的 JWT 的样本 JWS 表示。
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImExIn0
.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMiwiZXhwIjoxNTMxNzYyMDY1fQ
.z4qfO0leZK2mYp_w-jFNidTx-Ri0PRMHLsOAG1Den7ZR4QntIJhU17U0afgoe5VzISXS6jW61ga3XEk39ey1G7a_-ARIVZLYN11fHDhsPuzN7PPkbT
5uWpHEUhVWRR8dxHqXmNiDaWjNhTnzHCBpfrRHj5pR_dzubbuE_uPuvDk

如样本中所示, JWS 具有以下部分并以 "." 分隔。 字符。

  • 头 = eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImExIn0
  • 有效内容 = G4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMiwiZXhwIjoxNTMxNzYyMDY1fQ
  • 签名 = z4qfO0leZK2mYp_w-jFNidTx-Ri0PRMHLsOAG1Den7ZR4QntIJhU17U0afgoe5VzISXS6jW61ga3XEk39ey1G7a_-ARIVZLYN11fHDhsPuzN7PPkbT5uWpHEUhVWRR8dxHqXmNiDaWjNhTnzHCBpfrRHj5pR_dzubbuE_uPuvDk