【问题标题】:How to authenticate Shopware 6 <base-app-url> correctly如何正确验证 Shopware 6 <base-app-url>
【发布时间】:2023-01-18 03:12:52
【问题描述】:

使用 Admin SDK 可以进一步丰富 Shopware 6 中的管理。如应用程序安装指南中所述,需要在应用程序的清单文件中提供入口点 (base-app-url)。

由于每个请求都需要进行适当的身份验证,因此此 GET 请求也需要进行身份验证。但是,我无法以与使用来自modules 的 GET 请求成功执行此操作相同的方式对它进行身份验证。

base-app-url 请求如下所示(在我的例子中有一些 [自定义] 实体权限):

http://localhost:3000/sdk?location-id=sw-main-hidden&privileges=%7B%22read%22%3A%5B%22language%22%2C%22ce_atl_faq_group_faqs%22%2C%22ce_atl_faq_group%22%2C%22ce_atl_faq%22%5D%2C%22create%22%3A%5B%22ce_atl_faq_group_faqs%22%2C%22ce_atl_faq_group%22%2C%22ce_atl_faq%22%5D%2C%22update%22%3A%5B%22ce_atl_faq_group_faqs%22%2C%22ce_atl_faq_group%22%2C%22ce_atl_faq%22%5D%2C%22delete%22%3A%5B%22ce_atl_faq_group_faqs%22%2C%22ce_atl_faq_group%22%2C%22ce_atl_faq%22%5D%7D&shop-id=sbzqJiPRrbHAlC2K&shop-url=http://localhost:8888&timestamp=1673970817&sw-version=6.4.18.0&sw-context-language=2fbb5fe2e29a4d70aa5854ce7ce3e20b&sw-user-language=de-DE&shopware-shop-signature=40c6344cbdf358c5433426886d0e20c7cf3daa270e159bef775ef21afe486707

店铺有以下数据

Shop {
  _id: 'sbzqJiPRrbHAlC2K',
  _url: 'http://localhost:8888',
  _secret: '3c5a2f031006791f2aca40ffa22e8febbc8a53d8',
  _apiKey: 'SWIAB2PVODCWSLZNDMC5ZM1XWA',
  _secretKey: 'VnNwM0ZOMnN1Y05YdUlKazlPdlduWTdzOHhIdFpacjVCYkgzNEg'
}

我目前正在验证我的模块,如下所示 (Node.js):

export function authenticateGetRequest(req: Request, shop: Shop): void {
    // 40c6344cbdf358c5433426886d0e20c7cf3daa270e159bef775ef21afe486707
    const signature = getSignatureFromQuery(req);

    verifySignature(shop.secret, removeSignatureFromQuery(req, signature), signature);
}

function getSignatureFromQuery(req: Request): string {
    if (!req.query[SHOPWARE_SHOP_SIGNATURE_HEADER]) {
        throw new Error('Signature is not present in request!');
    }

    return req.query[SHOPWARE_SHOP_SIGNATURE_HEADER] as string;
}

function removeSignatureFromQuery(req: Request, signature: string): string {
    const query = Object.keys(req.query).map(key => key + '=' + req.query[key]).join('&');

    return query.replace(`&${SHOPWARE_SHOP_SIGNATURE_HEADER}=${signature}`, '');
}

function verifySignature(secret: string, message: string, signature: string): void {
    const hmac = crypto.createHmac('sha256', secret).update(message).digest('hex');

    if (hmac !== signature) {
        throw new Error('Signature could not be verified!');
    }
}

但是 base-app-url 无法正确验证,并且“无法验证签名!”错误被抛出。

我在这里做错了什么?

【问题讨论】:

    标签: shopware6 shopware6-app


    【解决方案1】:

    因此,主要区别在于那些其他请求在标头中传送凭据,但由于 base-app-url 用作 iframe 的源,因此对于该特定请求,它们必须使用查询参数传送。

    我不熟悉您正在使用的应用程序服务器的节点 js 实现,但您只需要确保对基本 url 的请求从查询而不是标头中获取基本参数,例如&amp;shopware-shop-signature=... 而不是 SHOPWARE_SHOP_SIGNATURE_HEADER

    您也可以考虑将 base-app-url 指向应用服务器范围之外的静态页面。由于该页面将在 iframe 中加载,您可以使用客户端 javascript 读取查询参数,并在必要时使用请求标头中预期的凭据向您的应用服务器发出请求。请记住,如果您需要处理个性化数据,您实际上只需要身份验证,否则您也可以在不需要身份验证的情况下提供静态资产。

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 2012-08-01
      • 2019-02-08
      • 2023-01-03
      • 2011-11-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多