我在Java中编码/解码JWT字符串...专门用于应用内购买。
我正在看这个例子
https://code.google.com/p/gwdg-java/source/browse/src/java/com/google/iapsample/JWT_Handler.java
我可以使用SIGNING键将字符串编码为JWT。
然后我可以通过调用deserialize()将JWT解码回源字符串。
但是如果你看一下代码 - 你注意到该方法没有使用 SIGNING键解码...但它确实正确解码。
困惑!
JWT字符串中的密钥本身 - 这没有任何安全意义!
答案 0 :(得分:3)
不要将签名与加密混淆。
密钥用于生成数字签名,稍后将用于验证JWT的真实性。
请参阅下面的JWT规范以获取示例:
http://tools.ietf.org/id/draft-jones-json-web-token-08.html#rfc.section.3.1
您还可以使用下面的JWT解码器测试您的集成:
https://developers.google.com/commerce/wallet/digital/docs/jwtdecoder
答案 1 :(得分:1)
当你说DECODE时,你的意思是什么?
您可以解码base64部分。它可以(通常是)用于携带信息。哪个客户可以使用。用户名,角色和其他公共事物。
JWT被视为一种魔力。但它不是,因为客户端只是包含一些信息的普通令牌。
服务器创建此令牌并使用密码/密钥对其进行签名,该密码/密钥仅在服务器端。因此服务器创建令牌,只有服务器可以使用此密码验证它。
你可以在那里看到标题/信息部分/和哈希/签名。
信息和标题是纯粹的base64,您可以自由阅读它们。本网站上的演示显示使用给定的SECRET密码生成jwt。如果您修改信息部分,则会重新签名令牌。只有在知道此密码的情况下才能验证令牌。
我最喜欢的文章有很好的java评论:http://blog.jdriven.com/2014/10/stateless-spring-security-part-2-stateless-authentication/
答案 2 :(得分:0)
免责声明:我是一个不的Java开发人员,所以这是基于我的(非Java-dev)读取源代码.. 我也不使用您引用的示例强>
public String deserialize(String tokenString)
正在从Base64解码为字符串和String jwtPayloadSegment = pieces[1];
)和pieces[2]
private String[] splitTokenString(String tokenString)
)
如上所述,我不是Java开发人员,也不使用该示例。代码看起来像(再次注意我的免责声明)它只是如何创建请求(发送给Google),不作为处理程序的示例让您的听众验证来自Google的传入回调。
示例代码在执行此操作时应该仍然有用,因为验证时过程类似 - re :(重新)构建JWT签名并将其与传入POST请求中的已解析签名进行比较。
看起来像样本:
Main_Servlet.java
)并构建JWT 示例中没有可以看到的代码,供您的听众处理来自Google的包含JWT订单的帖子 - 您需要编写该代码(是的,您需要验证来自谷歌的JWT。)
Hth - 如果我对阅读来源有误,我可能就是。