Shopify嵌入式应用API采用Access Token认证方案是否可行?
我有一个店铺使用的嵌入式Shopify应用,仅包含前端,API部署在Azure Function App中。我在函数应用里写了authentication_helper.py工具文件,通过请求头验证Shopify token来限制只有Shopify应用能调用接口。前端通过Ajax请求在请求头里传递X-Shopify-Domain和X-Shopify-Access-Token。我觉得这个方案从API层面提升了安全性,但担心X-Shopify-Access-Token泄露带来风险。因为用户已经登录Shopify管理后台,不想额外开发登录流程,想问这个认证方案是否合适?
相关代码
authentication_helper.py
import os import requests import json from azure.functions import HttpRequest, HttpResponse from shared.log_helper import logger INTERNAL_SECRET_KEY = os.getenv('INTERNAL_SECRET') def verify_shopify_token(domain: str, token: str) -> bool: try: response = requests.get(f'https://{domain}/admin/shop.json', headers={'X-Shopify-Access-Token': token}) return response.status_code == 200 except requests.RequestException: return False def shopify_auth_required(func): def wrapper(req: HttpRequest): logger.info("Incoming headers: %s", req.headers) logger.info("Incoming params: %s", req.params) # 检查内部密钥 internal_key = req.headers.get('X-Internal-Secret') if internal_key == INTERNAL_SECRET_KEY: return func(req) # 执行Shopify认证 domain = req.headers.get('X-Shopify-Domain') or req.params.get('domain') token = req.headers.get('X-Shopify-Access-Token') or req.params.get('token') if not domain or not token or not verify_shopify_token(domain, token): response_content = json.dumps({'error': 'Unauthorized', 'message': 'You are not authorized to access this resource.'}) return HttpResponse(response_content, status_code=401, mimetype="application/json") return func(req) return wrapper
前端请求代码
// --- 工具函数 --- // const fetchAPI = (url, method, data, successHandler, errorHandler) => { $.ajax({ url, method, contentType: "application/json", dataType: "json", headers: { "X-Shopify-Domain": "{{ shopify_domain }}", "X-Shopify-Access-Token": "{{ shopify_access_token }}" }, data: JSON.stringify(data), success: successHandler, error: errorHandler, }); };
这个认证方案基本可行,但你担心的token泄露风险确实存在,下面具体分析并给出优化建议:
方案合理性
- 基础安全保障到位:通过调用Shopify官方的
/admin/shop.json接口验证token有效性,确保只有持有合法Shopify访问令牌的请求能调用你的API,能有效拦截未授权的恶意请求。 - 适配嵌入式应用场景:利用用户已登录Shopify后台的状态,无需额外开发登录流程,减少了开发成本和用户操作负担。
核心风险点
X-Shopify-Access-Token暴露在前端的风险不可忽视:
- 前端渲染后,用户可通过浏览器开发者工具直接查看请求头或页面源码获取token。
- 一旦token泄露,攻击者可以该店铺的身份调用Shopify Admin API,甚至通过你的接口操作店铺数据,风险极高。
优化建议(无需额外登录流程)
1. 缩短token有效期
在Shopify应用设置中,尽量缩短访问令牌的有效期,即使泄露,攻击者可利用的时间窗口也会大幅缩小。
2. 严格限制token权限范围
申请Shopify访问令牌时,只请求应用实际需要的最小权限(比如只读订单、产品权限),而非全权限。这样即便token泄露,攻击者能实施的破坏也会被限制。
3. 增加请求来源验证
在Azure Function的认证逻辑中,添加对请求来源的校验:
- 检查请求的
Referer头是否来自你的Shopify嵌入式应用域名(例如https://[你的应用域名].myshopify.com/...) - 或者利用Shopify嵌入式应用的
Shopify-App-Signature做验证(结合应用密钥和请求参数生成签名,确保请求来自Shopify官方嵌入环境)
4. 避免前端直接暴露token
可调整架构,让前端先向Shopify代理接口发起请求,再由Shopify转发到你的Azure Function,这样token不会直接出现在前端代码中。该方案适合对安全要求较高的场景,需要调整应用部署方式。
总的来说,当前方案可作为基础版本使用,但必须结合上述优化措施降低token泄露风险,尤其是权限限制和来源验证,成本低但防护效果明显。
内容的提问来源于stack exchange,提问作者Ross

