You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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泄露风险确实存在,下面具体分析并给出优化建议:

方案合理性

  1. 基础安全保障到位:通过调用Shopify官方的/admin/shop.json接口验证token有效性,确保只有持有合法Shopify访问令牌的请求能调用你的API,能有效拦截未授权的恶意请求。
  2. 适配嵌入式应用场景:利用用户已登录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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:40:08