Shopify卸载Webhook随机射击

时间:2018-03-07 12:04:57

标签: shopify webhooks shopify-app

背景

我正在构建Shopify嵌入式应用,并依赖app / uninstall webhook在用户卸载应用后撤消用户访问权限。我通过从我的数据库中删除访问令牌并将其添加到卸载列表来撤销其访问权限。

问题

Shopify应用/卸载webhook多次触发,有时非常随机(即凌晨3点)。这会导致问题,因为如果用户重新安装应用程序,我会偶尔获取随机卸载webhook并取消其访问权限

问题

处理Shopify webhooks及其潜在的随机性/重复性是一种负责任的方式,以便在处理卸载时我有信心吗?

1 个答案:

答案 0 :(得分:1)

经过相当多的测试和论坛研究,我已经找到了一个很好的防御性编码策略,以及Shopify webhooks的随机性。

<强>解决方案

守卫守卫!不要仅仅依靠webhook来触发数据库操作。请参阅下面的防御性编码练习。

  1. 当您收到卸载时,webhook会以状态200快速响应.Shopify要求您在5秒内回复。快速验证webhook,将其有效负载添加到队列中,然后以状态200响应。我添加的有效负载只是卸载的商店的名称。在请求正文中发送的数据仅是有关商店的信息。它没有包含任何关于webhook的独特之处,以便将其与可能针对同一商店解雇的其他卸载webhook区分开来。
  2. 您的队列应该是一个列表,在添加新节点后触发另一个函数运行。通过使用队列来完成繁重的工作,您可以花费更多时间执行数据库操作,而无需担心5s响应时间。我正在使用Firestore作为数据库和Cloud Firestore Triggers。队列处理的后端设置工作得很好。我的函数只运行新商店卸载节点的onCreate(),所以即使多个卸载webhooks反复激活,我的函数也只运行一次。
  3. 我在队列中添加新卸载时运行的功能首先检查是否可以使用我已经在我的数据库的users节点中保存的其他商店访问令牌。如果我被阻止使用访问令牌,那么这实际上是一个真正的卸载,应该被处理。如果我仍然可以使用访问令牌,则应忽略卸载。
  4. 当用户重新安装应用程序时,我会将其从卸载队列中删除,然后再次通过身份验证过程发送它们以获取新的访问令牌。