【发布时间】:2019-01-16 11:25:23
【问题描述】:
我正在编写一个函数来手动验证并获取 jwt access_token 的标头和有效负载对 我正在使用https://jwt.io/ 提供的示例令牌进行测试 此时我的代码非常简单
string[] tokenSegments = Token.Split('.');
string tokenHeaders = Encoding.UTF8.GetString(Convert.FromBase64String(tokenSegments[0]));
string tokenPayload = Encoding.UTF8.GetString(Convert.FromBase64String(tokenSegments[1]));
当它到达 tokenPayloadLine 时,我得到以下异常
System.FormatException: 输入不是有效的 Base-64 字符串,因为它包含 > 非 base 64 字符、两个以上的填充字符或填充字符中的非法 > 字符。 在 System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength) 在 System.Convert.FromBase64String(String s)
并且在这个级别抛出异常
Convert.FromBase64String(tokenSegments[1])
请注意,我可以毫无例外地获取标题值
我已经尝试并编辑了令牌以更改有效负载中可用的整数值以使其成为字符串,然后我成功获取有效负载
只是比较 抛出异常的编码字符串是
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
而工作正常的是
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoiMTUxNjIzOTAyMiJ9
如果你对它们都进行解码,你会发现唯一的区别是导致异常的整数值
我做错了吗?这不是转换函数的预期用途吗?任何想法或建议都会有所帮助,请注意我需要手动执行此操作,因为我完全了解在线可用的 jwt 库。
【问题讨论】:
-
我预计会有一个无效的长度异常,而不是这个。
-
JWT 不使用普通的 Base64,它使用名为 base64url encoding 的东西。
Convert方法无法处理这个问题(但我链接到的页面包含一些代码和库方法的链接)。