Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用许多可能的秘密验证Shopify webhook_Javascript_Security_Shopify_Webhooks - Fatal编程技术网

Javascript 用许多可能的秘密验证Shopify webhook

Javascript 用许多可能的秘密验证Shopify webhook,javascript,security,shopify,webhooks,Javascript,Security,Shopify,Webhooks,我已经创建了一个仪表板,用于聚合多个Shopify商店的订单处理。这是一个私人应用程序,所以我将每个Shopify商店的API凭据和webhook机密保存在我的数据库中。我用一个存储为环境变量的密钥加密了所有这些敏感信息。对于任何给定的事件,我将所有Shopify商店指向同一个回调URL。因此,对于每个url,我必须根据存储在数据库中的所有可能的webhook机密验证请求主体。我有两个问题: 对于保护商店的API凭据和webhook机密,这是一种可接受的方法吗 如果我的机密存储在数据库中,如何同

我已经创建了一个仪表板,用于聚合多个Shopify商店的订单处理。这是一个私人应用程序,所以我将每个Shopify商店的API凭据和webhook机密保存在我的数据库中。我用一个存储为环境变量的密钥加密了所有这些敏感信息。对于任何给定的事件,我将所有Shopify商店指向同一个回调URL。因此,对于每个url,我必须根据存储在数据库中的所有可能的webhook机密验证请求主体。我有两个问题:

  • 对于保护商店的API凭据和webhook机密,这是一种可接受的方法吗
  • 如果我的机密存储在数据库中,如何同步验证请求正文?下面是我的验证函数
  • 验证:(缓冲区,hmacHeader)=>{
    Brand.find().exec((错误,品牌)=>{
    如果(!err&&brands){
    const allWebhookSecrets=brands.map(brand=>{
    log(`encrypted webhook secret为:${brand.shopify\u webhook\u secret\u encrypted}`)
    返回加密。解密(brand.shopify\u webhook\u secret\u encrypted);
    });
    const webhookIsValid=allWebhookSecrets.some(secret=>{
    var hmac=crypto.createHmac('sha256',secret)
    .更新(缓冲区)
    .摘要(“base64”);
    返回hmac==hmacHeader;
    });
    log(`webhookIsValid:${webhookIsValid}`);
    返回webhookIsValid;
    }
    返回false;
    });
    
    }
    通常,您真正应该存储在数据库中的唯一内容是应用程序的stores access令牌和商店登录的任何其他验证数据。每次使用您的应用共享机密和Webhook将要发送给您的数据向您的应用发送请求时,Webhook签名和生成方式都不同

    使用您的应用共享机密和发送到标题中的HMAC签名的post请求数据对Webhook进行验证:
    X-Shopify-HMAC-SHA256

    这是我对webhook验证中间件的简化nodejs实现

    function verify_webhook(postData, hmac) {
        if (!hmac || !postData || typeof postData !== 'object') {
          return false;
        }
    
        const calculatedSignature = crypto.createHmac('sha256', process.env.SHOPIFY_SHARED_SECRET)
        .update(postData)
        .digest('hex');
        return calculatedSignature === hmac;
      }
    
    其中postData和hmac是
    JSON.stringify(req.body)
    req.get('X-Shopify-hmac-SHA256')


    通常情况下,将这些信息存储在数据库中,然后使用中间件计算并动态验证这些信息是没有意义的。我希望这会有所帮助。

    通常,您真正应该存储在数据库中的唯一内容是应用程序的stores access令牌和商店登录的任何其他验证数据。每次使用您的应用共享机密和Webhook将要发送给您的数据向您的应用发送请求时,Webhook签名和生成方式都不同

    使用您的应用共享机密和发送到标题中的HMAC签名的post请求数据对Webhook进行验证:
    X-Shopify-HMAC-SHA256

    这是我对webhook验证中间件的简化nodejs实现

    function verify_webhook(postData, hmac) {
        if (!hmac || !postData || typeof postData !== 'object') {
          return false;
        }
    
        const calculatedSignature = crypto.createHmac('sha256', process.env.SHOPIFY_SHARED_SECRET)
        .update(postData)
        .digest('hex');
        return calculatedSignature === hmac;
      }
    
    其中postData和hmac是
    JSON.stringify(req.body)
    req.get('X-Shopify-hmac-SHA256')


    通常情况下,将这些信息存储在数据库中,然后使用中间件计算并动态验证这些信息是没有意义的。我希望这能有所帮助。

    我并没有将签名存储在数据库中,只是将连接到应用程序的不同商店的不同秘密存储在数据库中。我不能将这些秘密存储为环境变量,因为存储是动态删除和添加的。所以我想知道在数据库中以纯文本形式存储机密是否是个好主意。至于验证码,因为机密存储在数据库中,所以必须异步检索。要中止缓冲区的处理(拒绝webhook请求),可能会抛出一个错误,但在异步数据库调用后我是否仍能抛出一个错误?我实际上并没有将签名存储在数据库中,只是连接到应用程序的不同存储的不同秘密。我不能将这些秘密存储为环境变量,因为存储是动态删除和添加的。所以我想知道在数据库中以纯文本形式存储机密是否是个好主意。至于验证码,因为机密存储在数据库中,所以必须异步检索。要中止缓冲区的处理(拒绝webhook请求),可能会抛出一个错误,但是在异步数据库调用之后我仍然可以抛出一个错误吗?