Shopify oauth中的HMAC-SHA256问题(输出不匹配)

我正在尝试按照此文档在Shopify市场上发布应用程序。 而且我坚持在oauth文档的第3步,你必须做’HMAC签名validation’。

文档说明您必须使用应用程序的共享密钥通过HMAC-SHA256处理字符串(在下面指定)。

String = "shop=some-shop.myshopify.com&timestamp=1337178173" 

我正在尝试使用Java实现这些步骤。 以下是我使用的代码的要点。

  private static final String HMAC_ALGORITHM = "HmacSHA256"; String key = "hush"; String data = "shop=some-shop.myshopify.com&timestamp=1337178173"; SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(),HMAC_ALGORITHM); Mac mac = Mac.getInstance(HMAC_ALGORITHM); mac.init(keySpec); byte[] rawHmac = mac.doFinal(data.getBytes()); System.out.println(Hex.encodeHexString(rawHmac)); 

代码生成以下字符串:

 c2812f39f84c32c2edaded339a1388abc9829babf351b684ab797f04cd94d4c7 

通过Shopify开发者论坛上的一些随机搜索,我找到了一个问题的链接。

来自@Shayne的最后一条消息表明我们必须通过添加protocol字段来更改data变量。

但它没有成功:(

谁能告诉我应该做什么?我是否必须在我的代码中进行修改或者文档中的过程已经改变。 请帮忙。

这个例子显然是错误的。 您的哈希代码没问题。 您需要确保包含Shopify响应中的所有参数,例如,用于validation响应的输入将如下所示:

 code={code}&protocol=https://&store={store}&timestamp={timestamp} 

请参阅: https : //ecommerce.shopify.com/c/shopify-apis-and-technology/t/you-broke-my-build-hmac-verification-broken-282951

这是validationShopify HMAC所需的java代码。 协议参数不是必需的,除非它是shopify的结果,而不是来自我。

 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String HMAC_ALGORITHM = "HmacSHA256"; resp.setContentType("text/html;charset=UTF-8"); Map parameters = req.getParameterMap(); String data = null; SortedSet keys = new TreeSet(parameters.keySet()); for (String key : keys) { if (!key.equals("hmac")&&!key.equals("signature")){ if (data == null){ data = key + "=" +req.getParameter(key); } else { data = data + "&" + key + "=" + req.getParameter(key); } } } SecretKeySpec keySpec = new SecretKeySpec(SHARED_KEY.getBytes(),HMAC_ALGORITHM); Mac mac = null; try { mac = Mac.getInstance(HMAC_ALGORITHM); mac.init(keySpec); byte[] rawHmac = mac.doFinal(data.getBytes()); if (Hex.encodeHexString(rawHmac).equals(req.getParameter("hmac"))){ //THE HMAC IS VERIFIED } else { //THE HMAC IS NOT VERIFIED } } catch (NoSuchAlgorithmException | InvalidKeyException e) { e.printStackTrace(); } } 

有趣的是,数据中的timestamp参数变为

 ×tamp=1459537704 

代替

 &timestamp=1459537704