我有一个JWT令牌,并且我正在尝试解码有效负载。我要解码的字符串是:
eyJzdWIiOiIyMzEzOTE6MTAxMjpFQiBBZG1pbixFQiBDaGVjayBJbi9PdXQgUmVzb3VyY2VzLEVCIE1hc3RlciBBZG1pbiIsImV4cCI6IjE1NDUyNTc2MDkiLCJhdWQiOiI0OTk0QzgxMC02QUMyLTQ3NkYtQjUyQi04MjQ5NUUzRUNBNTgifQ
如果我转到https://www.base64decode.org/并插入该字符串,它将解码为:
{"sub":"231391:1012:EB Admin,EB Check In/Out Resources,EB Master Admin","exp":"1545257466","aud":"4994C810-6AC2-476F-B52B-82495E3ECA58"}
但是,这个:
byte[] dataPayload = Convert.FromBase64String(tokenPayload);
我得到:
Base-64 char数组或字符串的长度无效
不确定我做错了什么。
编辑:
这是JWT.IO提供的整个JWT(我添加了换行符,因此更易于阅读)...
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9。 eyJzdWIiOiIyMzEzOTE6MTAxMjpFQiBBZG1pbixFQiBDaGVjayBJbi9PdXQgUmVzb3VyY2VzLEVCIE1hc3RlciBBZG1pbiIsImV4cCI6IjE1NDUyNTc4ODMiLCJhdWQiOiI0OTk0QzgxMC02QUMyLTQ3NkYtQjUyQi04MjQ5NUUzRUNBNTgifQ。 0oaXmDOlYdHSTLo7t7fFpHG2T0DMRpAoERxiM_Ur5O4
同一两行代码运行正常:
string tokenPayload = _jwtData.WebToken.Split('.')[1];
byte[] dataPayload = Convert.FromBase64String(tokenPayload);
但是由于某种原因,我不明白,现在我收到了此错误。
答案 0 :(得分:1)
您缺少填充。看一下以下内容:https://en.wikipedia.org/wiki/Base64#Output_padding
所以你的情况,正确的JWT令牌是:eyJzdWIiOiIyMzEzOTE6MTAxMjpFQiBBZG1pbixFQiBDaGVjayBJbi9PdXQgUmVzb3VyY2VzLEVCIE1hc3RlciBBZG1pbiIsImV4cCI6IjE1NDUyNTc2MDkiLCJhdWQiOiI0OTk0QzgxMC02QUMyLTQ3NkYtQjUyQi04MjQ5NUUzRUNBNTgifQ ==
答案 1 :(得分:1)
似乎JWT.IO有自己的解码自己的有效负载的方法。这是正确的方法:
string jwt = JWT.Decode("...token...", "...encoded Secret Key...", JwsAlgorithm.HS256);
JWT来自其NuGet软件包的Jose.JWT
。