如何验证来自 Shopify 应用代理的流动页面的 POST 请求?

问题描述 投票:0回答:1

我是网络开发的新手,对 Shopify 应用代理的安全性有一些疑问。作为参考,我正在使用 Shopify 的二维码应用程序示例

我目前设置了一个应用程序代理来返回一个流动页面,该页面填充了我数据库中存储的信息。我目前正在使用 Shopify 推荐的方法(使用 Javascript 而不是 Ruby,如果重要的话)验证对我服务器上代理端点的请求,我服务器上的端点位于

/proxy_route/
。如果签名不匹配,我将返回 401 错误,这就是我的第一个问题:

1。如果签名匹配且请求通过验证,直接访问数据库实例填充页面是否安全?

例如,我有类似于 示例的二维码 GET 端点 的东西,但是我没有从我的代理调用这个端点,而是直接访问数据库,就像这样:

app.get("/proxy_route/", async (req, res) => {
    if (verifyRequest(req, res) {
        try {
            const rawCodeData = await QRCodesDB.list(await "<shop_name>.myshopify.com"); // (changed to match with the GitHub page, in my example no sessions exist because it's a custom app intended for 1 shop)

            const response = await formatQrCodeResponse(req, res, rawCodeData);
            res.status(200).set("Content-type", "application/liquid").send(JSON.stringify(response)); // again, just for simplicity. In my code this data gets processed and inserted into a real liquid page and that get's returned instead of raw results
        } catch (error) {
            console.error(error);
            res.status(500).send(error.message);
        }
    else {
        res.status(401).send("Not authorized").
    }
});

据我所知,这应该是安全的,因为任何未经授权的请求都会因

verifyRequest()
而获得 401,对吗?

对于我的下一个问题,我在

/proxy_route/post
提供另一个页面,该页面在验证成功后返回静态液体页面(与上面完全相同,减去任何数据库内容),但该页面包含我上传的表单和图像希望能够发布到我的数据库中。我验证用户使用 liquid guards 登录,像这样:

{% if customer %} <show form> {% else %} <tell customer to sign in> {% endif %}

因此,如果客户能够点击“提交”按钮,我可以保证他们已登录。这是我的主要问题所在,因为我不确定身份验证应该如何用于 POST 请求。该表单将用于上传与客户帐户相关的信息,因此是否可以获取当前客户的会话并将其传递到请求中(我将如何验证)?我可以只在标题中传递

{{ customer.id }}
{{ customer.email }}
并假设它是有效的,因为我已经验证了原始代理请求是有效的吗?如果我这样做,什么会阻止其他人使用随机数而不是真正的
{{ customer.id }}
发出 POST 请求?我假设请求将来自客户端 Javascript(使用
<script>
标签),所以这意味着没有与 Shopify 相关的身份验证,对吗?我也在寻找一种方法让客户删除他们发布到数据库的内容,那么我如何验证删除自己信息的是真正的客户呢?我在这方面遇到了障碍,所以任何见解都将不胜感激!

database proxy shopify liquid
1个回答
0
投票

您不再需要验证客户 ID,因为 Shopify 可以方便地在安全标头数据中包含一个有效的客户 ID,这意味着人们无法篡改它。因此,在主题中,这是对客户的检查,如果他们已登录,您可以确保 ID 作为合法数据到达 Shopify 代理。

© www.soinside.com 2019 - 2024. All rights reserved.