基本上我的问题与此类似:
略有不同,另一边是Shopify。
背景资料: Shopify用户购买了一些积分(Audible风格),并想知道他有多少可用。他登录到他的帐户,并说它有X点。
这个号码来自对我服务器的AJAX调用(我有完全控制权),其中有一个简单的php脚本,用于检查db中的值(使用Shopify中的webhook更新,每个都需要进行验证,以便他们进行验证我认为是安全的。
脚本使用客户ID进行查找,并且该值需要以某种方式传递给脚本,并允许外部人员继续运行它,直到他拥有所有ID和相应的信用值。
所以,我的问题是,我该怎么做呢?如何确保只有经过身份验证的用户才能对其进行检查,并且仅针对其ID进行检查。
关于Shopify文档有很多关于以其他方式保护连接的信息,即确保只有正确的脚本可以访问Shopify数据库,但没有关于我的问题。
据我所知,我只能访问Shopify上的JS,这会产生问题,因为我发送到服务器的所有内容都是可见的。
由于
编辑:我刚读了CSRF。我可以轻松实现原点和标题的检查,但这些可以伪造,对吗?
编辑2:我使用metafields解决了这个问题。因此,我只是使用Customer Metafield来存储可用的信用,而不是将所有信息存储在我的服务器的数据库中。 Webhooks是安全的,所以很棒。尽管如此,它仍然无法解决下一阶段的问题。客户仍然需要能够使用他们的积分并获得由我的服务器生成的数字产品。所以我仍然需要验证请求。
编辑3: @deceze的评论和@Jilu的回答让我思考。是的,你是对的,我需要这样做,但我没有访问Shopify的后端,所以我无法创建会话。但是,我能做什么(如果我弄清楚如何在js中)哈希呢。 PHP登录脚本在password_hash上运行。这样您就不会在db中存储密码。密码得到再次验证在数据库中哈希(或任何你调用),它是真或假。如果为true,则表示您已登录。因此,我可以尝试使用特定字符串(使其非常长)和用户ID生成令牌。发送请求,并使用password_verify或不是,请检查用户。弹出正面的那个记录在请求该信息的用户中。假设我可以在Shopify中隐藏字符串......
答案 0 :(得分:2)
步骤1:执行会话登录系统。 第二步:在Ajax之前,在表单或请求页面中生成一个随机令牌,将其放入输入显示无,用POST发送。 每次验证令牌是否已设置且与您获得的令牌相同。
您现在已验证用户是否确实已使用会话登录。 你检查过他是从右页开始的。
答案 1 :(得分:0)
您可以使用共享密钥(Shopify和服务器都拥有它)和客户端ID创建令牌。
{% assign my_secret_string = "ShopifyIsAwesome!" | hmac_sha256: "secret_key" %}
My encoded string is: {{ my_secret_string }}
我们将根据数据库中的值检查收到的哈希值,因此我们需要使用相同的算法和密钥来哈希本地客户端ID(这可能应该在接收客户创建webhook时完成)。
使用:http://php.net/manual/en/function.hash-hmac.php
创建哈希ID$hashed_id = hash_hmac('sha256', '$client_id', 'secret_key');
使用:http://php.net/manual/en/function.hash-equals.php
比较哈希$check = hash_equals($hashed_id, $received_id);
然后,所有需要的是遍历数据库直到找到匹配项。可能有更快捷的方法。