在Java中解码JWT令牌
最后修改:5月7日,2021年
1.概述
一种json web令牌(JWT)通常用于REST API安全性。虽然令牌可以通过框架解析,例如春天安全oauth.,我们可能希望在自己的代码中处理这个令牌。
在本教程中,我们会解码并验证JWT的完整性.
2.JWT令牌结构
首先,让我们了解JWT令牌的结构:
- 标题
- 有效载荷(通常被称为身体)
- 签名
签名是可选的。有效的JWT令牌可以仅包含标题和有效载荷部分。然而,我们使用签名部分来验证标题和有效载荷的内容为安全授权.
部分表示为Base64编码字符串分隔('。')分隔符。通过设计,任何人都可以解码JWT令牌并读取标题和有效载荷部分的内容。但是,我们需要访问用于创建签名以验证令牌的完整性的秘密密钥。
最常见的是,JWT包含用户的“声明”。这些代表有关用户的数据,API可以用于授予金宝搏官网188be提供令牌的用户的权限或跟踪。解码令牌允许应用程序使用数据,验证允许应用程序相信由可信源生成JWT。
让我们看看如何在Java中解码和验证令牌。
3.解码JWT令牌
我们可以使用内置的Java函数来解码令牌。
首先,让我们将令牌分成几个部分:
string [] chunks = token.split(“\\。”);
我们应该注意到正则表达式通过string.split.使用一个逃脱'。'避免'。'意思是“任何角色”。
我们的块数组现在应该有2或3个元素对应JWT的部分。
接下来,让我们使用Base64解码器解码标题和有效载荷零件:
base64.decoder解码器= base64.getdecoder();字符串标题=新字符串(解码器。(块[0]));String Payload = New String(解码器.Decode(块[1]));
让我们用jwt令牌运行这个代码(我们可以解码在线比较结果):
Eyjhbgciojiuzi1niisinr5cci6ikpxvcj9.eyjzdwiioixmjm0nty3odkwiiwixmftzsi6ikjhzwxkdw5nifvzzxiilcjpyxqioje1mtyymzkwmjj9.qh7zj_m3ky69kxhaqxta-ivipytkxxjzc1zsmapznge.
输出将给我们解码后的报头任何有效载荷:
{“ALG”:“HS256”,“典型”:“JWT”}{“子”:“1234567890”,“名字”:“Bael金宝搏188体育dung用户”,“iat”:1516239022}
如果在JWT令牌中仅定义标题和有效载荷部分,则完成并将信息已成功解码。
4.验证JWT令牌
接下来,我们可以验证标题和有效载荷的完整性,以确保通过使用签名部分未更改它们。
4.1。依赖性
对于验证,我们可以添加JJWT.对我们pom.xml.:
<依赖项> IO.JSONWEBTOKEN GROURID> JJWT ARIFACTID> 0.7.0 version> 依赖项>
我们应该注意我们需要从版本的图书馆版本0.7.0向前。
4.2。配置签名算法和密钥规范
为了开始验证有效载荷和报头,我们需要最初用于签名令牌的签名算法和秘钥:
SignaturealGorithm SA = HS256;scotekeyspec screttykeyspec = new scotterkeyspec(secretkey.getbytes(),sa.getjcaname());
在这个例子中,我们已经将签名算法硬编码为HS256。但是,我们可以解码标题的JSON并阅读all.字段以获得此值。
我们还应该注意这个变量密钥是密钥的字符串表示形式。我们可以通过它的配置或通过发出JWT的服务公开的REST API来为我们的应用程序提供这些。
4.3。执行验证
现在我们已经有了签名算法和密钥,我们可以开始执行验证了。让我们将头部和有效载荷重新组合成一个未签名的JWT,将它们与'。分隔符:
String tokenwithoutsignature =块[0] +“。”+块[1];字符串签名=块[2];
现在我们拥有未签名的令牌和提供的签名。我们可以使用库验证它:
defaultjwtsignaturevalidator validator = new defaultjwtsignaturevalidator(sa,secretkeyspec);if(!validator.isvalid(tokenwithoutsignature,signature)){抛出新例外(“无法验证JWT令牌完整性!”);}
让我们来分析一下。
首先,我们用所选的算法和secret创建一个验证器。然后我们向它提供未签名的令牌数据和提供的签名。
然后。验证器生成新的签名,并将其与提供的签名进行比较。如果它们相等,那么我们已经验证了标题和有效载荷的完整性。
结论
在本教程中,我们研究了JWT的结构以及如何将其解码为JSON。
然后,我们使用一个库来验证一个令牌的签名、算法和密钥的完整性。
一如既往,可以找到本教程中的代码示例在github上。