jwtjwt入门


备注

JSON Web令牌(JWT)是一种紧凑的,URL安全的方式,用于表示可以在各方之间交换的声明。

所有JWT都包含有效负载 ,它们是JSON哈希值。这些对象是字符串化和Base64编码的。编码的头和有效载荷与数字签名(JWS)组合,并且所有三个组件与“。”连接。 (期)。

进一步阅读

如何判断你是否有JWS或JWE?

来自JSON Web加密规范(RFC 7516)的第9节:

通过检查“alg”(算法)标头参数值,可以将JWS的JOSE标头与JWE的JOSE标头区分开来。如果值表示数字签名或MAC算法,或者值是“无”,则表示JWS;如果它代表密钥加密,密钥包装,直接密钥协议,密钥包装密钥协议或直接加密算法,则它适用于JWE。 (在使用JWS Compact Serialization或JWE Compact Serialization时,提取要检查的“alg”值很简单,使用JWS JSON序列化或JWE JSON序列化时可能会更困难。)

通过确定是否存在“enc”(加密算法)成员,还可以将JWS的JOSE标头与JWE标头区分开来。如果“enc”成员存在,则它是JWE;否则,它是一个JWS。

JWS(签名)##

{
  "alg": "HS256"
}
 

JWE(加密)

{
  "alg":"RSA1_5",
  "enc":"A256GCM",
  "iv":"__79_Pv6-fg",
  "x5t":"7noOPq-hJ1_hCnvWh6IeYI2w9Q0"
}
 

JSON Web加密(JWE)

JSON Web加密(JWE)使用基于JavaScript Object Notation(JSON)的数据结构表示加密内容。它定义了一种加密索赔数据的方法,以便只有预期的接收者才能读取令牌中的信息。

在JWE JSON序列化中,JWE表示为包含以下八个成员中的一些或全部的JSON对象:

  "protected", with the value BASE64URL(UTF8(JWE Protected Header))
  "unprotected", with the value JWE Shared Unprotected Header
  "header", with the value JWE Per-Recipient Unprotected Header
  "encrypted_key", with the value BASE64URL(JWE Encrypted Key)
  "iv", with the value BASE64URL(JWE Initialization Vector)
  "ciphertext", with the value BASE64URL(JWE Ciphertext)
  "tag", with the value BASE64URL(JWE Authentication Tag)
  "aad", with the value BASE64URL(JWE AAD)
 

六个base64url编码的结果字符串和两个不受保护的JSON对象值表示为JSON对象中的成员。

示例JWE

以下示例JWE Header声明:

  • 使用RSA-PKCS1_1.5算法将内容加密密钥加密到收件人以生成JWE加密密钥
  • 使用AES-256-GCM算法对明文进行加密,以生成JWE密文
  • 使用了具有base64url编码__79_Pv6-fg的指定64位初始化向量
  • 与用于加密JWE的密钥对应的X.509证书的指纹具有base64url编码7noOPq-hJ1_hCnvWh6IeYI2w9Q0。
{
 "alg":"RSA1_5",
 "enc":"A256GCM",
 "iv":"__79_Pv6-fg",
 "x5t":"7noOPq-hJ1_hCnvWh6IeYI2w9Q0"
}
 

Base64url编码JWE标头的UTF-8表示的字节产生此编码的JWE标头值(带有换行符仅用于显示目的):

eyJhbGciOiJSU0ExXzUiLA0KICJlbmMiOiJBMjU2R0NNIiwNCiAiaXYiOiJfXzc5
X1B2Ni1mZyIsDQogIng1dCI6Ijdub09QcS1oSjFfaENudldoNkllWUkydzlRMCJ
 

有关更多信息,请阅读JSON Web加密规范(RFC 7516)

签署JWT(JWS)

签名的JWT包含Base64 Url Safe编码签名作为第三个组件。用于生成签名的算法在标题中指示。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
.eyJzdWIiOiJKb2huIERvZSIsImFkbWluIjp0cnVlLCJpYXQiOjE0NzAzNTM5OTQsImV4cCI6MTQ3MDM1NzYyNywianRpIjoiNmU0MDRiYTgtZjg4NS00ZDVmLWJmYTItZTNmNWEwODM4MGE0In0
.7CfBdVP4uKsb0cogYepCvMLm8rcpjBYW1XZzA-a5e44
 

{
  "typ": "JWT",
  "alg": "HS256"
}
 

该JWT使用HMAC-SHA256算法签署,因此alg: HS256

有效载荷

{
  "sub": "John Doe",
  "admin": true,
  "iat": 1470353994,
  "exp": 1470357627,
  "jti": "6e404ba8-f885-4d5f-bfa2-e3f5a08380a4"
}
 

这个JWT可以用UTF-8秘密notsosecret 秘密来验证。

未签名的JWT

无符号JWT具有标头值alg: none 和空JWS(签名)组件:

eyJhbGciOiJub25lIn0
.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.
 

尾随点表示签名为空。

{
  "alg": "none"
}
 

有效载荷

{
  "iss": "joe",
  "exp": 1300819380,
  "http://example.com/is_root": true
}
 

什么存储在JWT中

JWT RFC建立了三类索赔:

  • 已注册的索赔,subissexpnbf

  • 具有IANA注册的公共名称或名称的公开声明 ,其中包含应该是唯一的值,如emailaddressphone_number 。查看完整列表

  • 在您自己的上下文和值中使用的私有声明可能会发生冲突

这些索赔都不是强制性的

JWT是自包含的,应该避免使用提供必要数据的服务器会话来执行身份验证(不需要服务器存储和数据库访问)。因此, rolepermissions 信息可以包含在JWT的私人声明中。

注册索赔

以下声明名称在10.1节建立的IANA“JSON Web令牌声明”注册表中注册

  • iss (发行人):识别发行JWT的委托人。
  • sub (subject):识别作为JWT主题的主体。必须是独特的
  • aud (观众):识别JWT的目标收件人(字符串数组/ uri)
  • exp (到期时间):标识到期时间(UTC Unix),之后您必须不再接受此令牌。它应该在发布之后。
  • nbf (不是之前):标识不允许接受JWT的UTC Unix时间
  • iat (发布于):标识发布JWT的UTC Unix时间
  • jti (JWT ID):为JWT提供唯一标识符。

{
    "iss": "stackoverflow",
    "sub": "joe",
    "aud": ["all"],
    "iat": 1300819370,
    "exp": 1300819380,
    "jti": "3F2504E0-4F89-11D3-9A0C-0305E82C3301"
    "context": {
        "user": {
            "key": "joe",
            "displayName": "Joe Smith"
        },
        "roles":["admin","finaluser"]
    }
}