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

时间:2015-09-14 12:39:13

标签: java oauth shopify sha256 hmac

我正在尝试按照this文档在Shopify市场上发布应用。而且我仍然坚持oauth文档的第3步,你必须做'HMAC签名验证'。

文档说明您必须使用应用程序的共享密钥通过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开发人员论坛上的一些随机搜索,我找到了question的链接。

来自@Shayne的最后一封邮件表明,我们必须通过添加data字段对protocol变量进行更改。

但它没有成功:(

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

3 个答案:

答案 0 :(得分:1)

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

javax.media

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

答案 1 :(得分:1)

以下是验证Shopify 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<String,String[]> parameters = req.getParameterMap();
    String data = null;
    SortedSet<String> keys = new TreeSet<String>(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

答案 2 :(得分:0)

这是我的产品代码:

.mat-button-toggle-checked {
   .mat-button-toggle-label-content{
       color:mat-color($primary)
    }
}