我基本上做了与this帖子非常相似的事情。我希望能够验证已经在IdentityServer上签名的一些JWT令牌,并且还有一些我尚未弄清楚的细节。这是一个示例标记:
eyJhbGciOiJSUzI1NiIsImtpZCI6IjBiZjM5OWIwYjRkNzY3OTE5MDFlYzlmNTUxNTZkMzdlIiwidHlwIjoiSldUIn0.eyJuYmYiOjE1Mjc4OTA2MDAsImV4cCI6MTUyNzg5NDIwMCwiaXNzIjoiaHR0cDovL2NvbW1hbmRjZW50ZXI6NTAwMCIsImF1ZCI6Imh0dHA6Ly9jb21tYW5kY2VudGVyOjUwMDAvcmVzb3VyY2VzIiwiY2xpZW50X2lkIjoiY29tbWFuZGNlbnRlciIsInN1YiI6ImU3NzY4MjEyLTdhMGYtNDA4YS04YzlmLWZmNDRmOTVlNzc2ZSIsImF1dGhfdGltZSI6MTUyNzg5MDYwMCwiaWRwIjoibG9jYWwiLCJzY29wZSI6WyJvcGVuaWQiLCJwcm9maWxlIl0sImFtciI6WyJwd2QiXX0.N6j_8Mbc-WAZInLnhauBS_dC6my3ggJEFGNBuuanJXGG5Q1mL7K9KZ11cgxrWQEp6NRS07bZrh02qA0Hcd0pLJzg0xB49CR-kFlA8PWdZ-wnf1U4VGq7ZZY2PaxccqextF-s3V-ObEsnPq7k1csTBM_lBW5u4m907q3zcHfPtW9RNz3kELKSuW1vMOWksrOOaJO3UGAPJgRcFjlc5imPykKQVCiAO9UV1nuNUHOLOu4XDim-f3YHLU24J-vbgxkqdUtgs4Xm43b3AplYrkN_TJ0ba5demtnQNd5No0s6bkqkuPvVGz2G3MD5tWkQVnu7kV7GNfTOvJlInCkDOE6few
将此结果转移到https://jwt.io/,您可以看到令牌解析为
{
"alg": "RS256",
"kid": "0bf399b0b4d76791901ec9f55156d37e",
"typ": "JWT"
}.
{
"nbf": 1527890600,
"exp": 1527894200,
"iss": "http://commandcenter:5000",
"aud": "http://commandcenter:5000/resources",
"client_id": "commandcenter",
"sub": "e7768212-7a0f-408a-8c9f-ff44f95e776e",
"auth_time": 1527890600,
"idp": "local",
"scope": [
"openid",
"profile"
],
"amr": [
"pwd"
]
}.
{SIGNATURE}
我已经看到了两种主要的签名方式。一个是使用一些每个人神奇地知道的passpharase来验证令牌。我们不希望在密码更改时管理更新多个客户端,因此这不是我们的选择。另一种方法是使用本质上的PKI方法,就像使用X509证书交换和验证HTTPS密钥一样。关于这个和这个特殊的例子,我有几个问题:
1。为什么不是令牌Base64编码的第3部分和最后部分?我猜它的Base64Url,是吗?其余的部分使用Base64,为什么不使用这个呢?
2。我们希望使用基本上SSL证书进行签名,并且我假设这个示例令牌已经完成相同的操作,但接收者如何知道应该获取哪个公共证书以验证此令牌?不应该提供证书序列号吗?
第3。为什么这个签名太大了?这似乎只是一个签名的许多字节的方式,是否有其他数据包装?