为什么JWT令牌中的头部和负载总是以eyJ开头?

84

我正在使用JWT令牌来授权我的 API,在实现过程中,我发现令牌中的头信息和有效载荷总是以eyJ开头。这表示什么?

2个回答

143

JWT由base64url编码的JSON和一个以{"...开头的JSON结构组成,编码时变为ey...

JWT头以{"alg":...开始,然后变为eyJ...

您可以在在线编码器上尝试,输入{"alg"并点击编码。结果将是eyJhbGciPSA=


6
太棒了!谢谢你。为了进一步澄清,输入{会得到"ey",后面跟一个字母会得到"eyJ",跟一个数字会得到"eyl"。 - DORRITO

-1

恐怕上面的问题和答案有点过于广泛/确定。

你能检查的最好的是(仅)'ey',因为第一个JSON成员可能是其他东西,比如“typ”(而不是“alg”); 我不建议假设JSON成员的顺序(即使它们应该遵循规定的顺序 - 即允许现实世界中的异常/少量弹性的可能性)。

此外,尽管这可能不太可能 - 就特定实现生成的内容而言,可能会在打开(JSON对象)大括号字符之后(甚至在其之前!)出现一些空格 - 我不确定标准/RFC是否禁止此操作,但即使它只是JWT生成过程中的暂时性错误实例,理论上也可能发生; 因此,在进行JWT的完整验证之前,您最好仅检查'ey' - 作为快速烟雾测试,然后再进行更全面/完整的验证。

(F.Y.I.我相信微软的“身份平台”可能是“typ”在“alg”之前 - 如果我记得正确的话(?),但我不能发誓我曾经看到过这种情况 - 至少在某个时间点上。)


1
无论第一个字段是什么,它总是{"开头,然后是一个字母。接受的答案是正确的。 - undefined
1
@ukrutt 部分正确,但回答中还提到了“JWT头部以{"alg":...”开头,这并不一定总是正确的,因此在某种程度上是误导性的/这部分有潜在错误;理想情况下,应该重新表述(以防止产生困惑,当其他人的结果与之不完全匹配时/当他们的JWT以'typ'属性而不是"alg"属性开头时)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接