Loopback调用Shopify Orders API鉴权失败,请求排查原因
问题分析与解决方案
咱们先拆解你遇到的问题:相同的Basic Auth凭证在curl里能用,但LoopBack的REST数据源配置却返回无效密钥错误,大概率是配置里的API端点路径错误或者请求头层级配置不当,下面具体说:
1. 错误的API端点URL
你当前配置的URL是https://mystore.myshopify.com/admin,但Shopify的Orders API必须指定具体的API版本和资源路径,比如最新稳定版的正确路径应该是:
https://mystore.myshopify.com/admin/api/2024-07/orders.json
Shopify API要求必须带版本号(比如2024-07)和具体资源路径(比如/orders.json),只到/admin的话,Shopify无法识别你要调用的具体接口,会返回权限类错误(虽然提示是密钥问题,但实际是端点不合法导致的校验失败)。
2. 请求头的层级与格式问题
你把Authorization头放在了operations的headers里,但LoopBack的REST Connector中,全局认证头应该放在数据源的顶层配置(除非你需要给单个接口单独配置)。另外,HTTP头的Accept(不是accepts)首字母需要大写,Shopify对HTTP头的大小写是敏感的。
修正后的数据源配置示例:
"ShopifyRestDataSource": { "name": "ShopifyRestDataSource", "connector": "rest", "headers": { "Accept": "application/json", "Content-Type": "application/json", "Authorization": "Basic MzdiOD..." }, "operations": [{ "template": { "method": "GET", "url": "https://mystore.myshopify.com/admin/api/2024-07/orders.json" }, "functions": { "findOrders": [] } }] }
3. 调用方式的规范调整
你当前调用的ds.find()是数据源的通用方法,更规范的是用你在functions里定义的方法名(比如上面的findOrders),调用代码可以改成:
var ds = app.dataSources.ShopifyRestDataSource; ds.findOrders(function(err, response, context) { if (err) throw err; if (response.errors) { next('> response error: ' + JSON.stringify(response.errors)); } console.log(response); next(); });
额外验证步骤
如果调整后还是有问题,可以开启LoopBack的调试日志,查看实际发送的请求头和URL是否和curl一致:
DEBUG=loopback:connector:rest npm start
通过日志对比curl的请求详情,就能快速定位两者的差异。
内容的提问来源于stack exchange,提问作者Jenna S
相关产品推荐
相关产品推荐

