【问题标题】:shopify app proxy: send customer data or only customer IDshopify 应用代理:发送客户数据或仅发送客户 ID
【发布时间】:2016-09-04 08:52:10
【问题描述】:

我需要为服务器端逻辑获取客户的姓名和电子邮件地址。

在我看来,有两种选择:

  1. 将请求正文中的数据提交到代理 URL 的表单
  2. 使用 URL 中的客户 ID 向代理 URL 发出 GET 请求,然后使用 shopify API 获取所有客户的信息

我倾向于使用选项 #1,因为它保存了对 Shopify 的调用,我将通过 https 发送数据。

你会如何建议这样做?

【问题讨论】:

    标签: shopify


    【解决方案1】:

    如果您要提交代理表单,您应该查看 Gavin Ballard's post 关于使用哈希验证客户的信息。

    我在使用application/liquid 响应应用程序代理获取时做类似的事情。请参阅下面示例中的 reqHash 字段。这是通过 ejs 处理的,其标签不会与任何动态值的液体冲突:

    例如

    {% if customer %}
        <input name="firstName" id="firstName" type="hidden" value="{{customer.first_name}}">
        <input name="lastName" id="lastName" type="hidden" value="{{customer.last_name}}">
        <input name="defaultAddr" type="hidden" value="{{ customer.default_address.id }}">
        <input type="hidden" name="custid" value="{{customer.id}}">
        <input type="hidden" name="reqHash" value="{{customer.id | append: '<%= custSecret %>' | md5}}"> 
    
        <div class="form-group">
            <label for="emailAddress">Email</label>
            <input name="emailAddress" id="emailAddress" type="text" value="{{customer.email}}" placeholder="Email">
        </div>
    
    {% else %}
    
    <div class="form-group">
        <label for="firstName">Name</label>
        <input name="firstName" id="firstName" type="text" value="" placeholder="First Name">
        <input name="lastName" id="lastName" type="text" value="" placeholder="Last Name">
    </div>
    <div class="form-group">
        <label for="emailAddress">Email</label>
        <input name="emailAddress" id="emailAddress" type="text" value="" placeholder="Email">
    </div>
    
    <div class="form-group">
        <label for="CreatePassword" class="hidden-label">Password</label>
        <input type="password" name="customer[password]" id="CreatePassword" class="input-full" placeholder="Password">
    </div>
    {% endif %}
    

    然后在表单发布时验证 reqHash。

    回复评论:

    问题是你想对谁保密。客户已经知道他们的信息。 Shopify 维护会话,因此他们相信信息与正确的 ID 相关联。 SSL 是一种安全传输,因此客户信息仅在浏览器中清晰可见。哈希让应用程序确保客户信息与正确的 ID 相关联。这是应用程序验证登录的方式。否则,不良行为者可以向应用发送任意信息。写了他们将从 id 查找客户信息的发帖人仍然需要验证 id,以便他们知道他们拥有有效登录客户的正确 id。

    事实上,自从我在 2016 年写这篇文章以来,我已经开始对包含在隐藏输入中的所有信息进行哈希处理。

    哈希可以保护您的应用免受黑客和无聊的脚本小子的攻击。

    【讨论】:

    • 感谢 sn-p,custSecret 是什么?是定制液体吗?
    • 另外,不建议提交敏感信息对吧?我想我将只提交客户 ID 和哈希,并通过 API 调用获取所有需要的数据
    • custSecret 只是为应用程序生成的随机值。我通过 https 提交信息,因此发布它与任何电子商务应用程序一样安全
    • 好的,我无法控制我的应用的安装位置,所以我必须采取所有措施。
    • 它与您的应用程序的安装位置无关。它与您的应用程序的服务来源有关。您应该从 https 端点提供应用程序。
    【解决方案2】:
    1. 暗示你可能会收到垃圾。传入的数据没有任何意义,因为机器人可以填写表格并提交。

    2. 至少意味着您有一个实际登录的客户。如果你有 ID,你也有来自 Liquid 的电子邮件和姓名。如果您的代理调用来自没有类似访问权限的脚本标签,您可以从秘密客户 ID cookie 值发送客户 ID,是的,进行 API 调用。这根本不是什么大问题。

    【讨论】:

    • 我在谈论从 Liquid 提交的表单。有一个签名处理,所以非 shopify 数据将被丢弃。
    • Shopify 肯定会在其表单上添加签名处理,但这对您没有帮助。您的服务器端代码也需要执行该步骤。应用代理明智。或者也按照下面的答案来弥补。
    猜你喜欢
    • 2013-12-31
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2013-02-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多