JWT(JSON Web Token)

JWT是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。

JWT是什么

一般是一个经过签名的字符串,通过.分割为三个部分,如:

eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.ewogImlzcyI6ICJodHRw
Oi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5NzYxMDAxIiw
KICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZfV3pBMk1qIi
wKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5NzAKfQ.ggW8hZ
1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6qJp6IcmD3HP9
9Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqkvPeB2T9CJNqeGpe-gccM
g4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7TpdQyHE5lcMiKP
XfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoSK5hoDalrcvR
YLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4XUVrWOLrLl0
nx7RkKU8NXNHq-rvKMzqg

第一部分称为header,第二部分称为playload,第三部分称为signature

headerplayload是两个base64编码的json字符串,直接用base64解码即可,以上面的jwt为例,解码的结果如下:

// header
{
  "alg":"RS256",
  "kid":"1e9gdk7"
}

// playload
{
 "iss": "http://server.example.com",
 "sub": "248289761001",
 "aud": "s6BhdRkqt3",
 "nonce": "n-0S6_WzA2Mj",
 "exp": 1311281970,
 "iat": 1311280970
}

signature是签名信息,JWT是否有效取决于对签名信息的验证是否通过

更多关于JWT的详情请看RFC7519

品高统一认证的JWT

在品高统一认证服务中,一般只会颁发两种JWT:

  • 访问令牌的JWT
  • ID Token的JWT

关于id token请看OpenID Connect Section 2

访问令牌使用RS256签名算法生成signature

ID Token使用HS256算法生成signature

playload的编码规范

由于jwt是需要在网络中传递的字符串,因此在base64编码时,会对playload进行url安全的编码,即:

  1. 去除尾部的"="
  2. 把"+"替换成"-"
  3. 把"/"替换成"_"

在解码playload时,需要先按照如下步骤进行url解码:

  1. 把"-"替换成"+"
  2. 把"_"替换成"/"
  3. (计算BASE64URL编码长度)%4
    a. 结果为0,不做处理
    b. 结果为1,字符串添加"==="
    c. 结果为2,字符串添加"=="
    d. 结果为3,字符串添加"="

url安全的解码完成之后,再进行base64解码,即可得到最初编码时的json。

results matching ""

    No results matching ""