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

Shopify App Bridge 2与shopify_app(Rails 6) JWT认证流程问题咨询

问题1解答

前端执行window.sessionToken = await getSessionToken(app)不会自动设置jwt.shopify_domain的值,这个操作只是把获取到的JWT字符串存储在前端window对象上,没有和后端做任何交互。
request.env['jwt.shopify_domain']的值是shopify_app gem的内置中间件生成的:你需要在发后端请求时,主动把sessionToken放到请求头Authorization中,格式为Bearer <你的sessionToken值>,中间件拿到这个JWT后会用你的Shopify应用API密钥验证签名有效性,验证通过后会从JWT的payload中提取商户域名,写入到request.env['jwt.shopify_domain']中供后续逻辑读取。
你现在返回401的最大概率原因就是没有主动把sessionToken附加到Ajax请求的头信息中,可以给请求库加全局拦截器自动带token,示例(axios):

axios.interceptors.request.use(config => {
  config.headers.Authorization = `Bearer ${window.sessionToken}`
  return config
})

问题2解答

/auth/shopify/callback路由是Shopify OAuth授权流程的回调地址,和AppBridge没有直接的运行时关联:

  • 之前Cookie会话模式下你用它来设置会话Cookie,属于这个路由的附加用法;
  • 迁移到JWT认证后,日常的接口请求、页面加载不需要再走这个路由做会话认证,但是这个路由不能删除:应用首次安装、申请新的API权限时,Shopify的OAuth流程还是需要跳转到这个回调地址来获取商户的永久访问令牌,存储到你的应用数据库中。

问题3解答

Rails后端识别有效sessionToken的完整流程如下:

  1. 前端每次发起Ajax请求时,都在请求头中携带Authorization: Bearer <sessionToken>;
  2. shopify_app gem的JWT验证中间件会提前拦截所有发往受认证保护接口的请求,取出请求头中的JWT字符串;
  3. 中间件用你配置的Shopify应用API密钥验证JWT的签名是否合法、是否过期、payload中的商户域名、应用API key是否匹配;
  4. 验证通过后,中间件会将解析得到的商户域名写入request.env['jwt.shopify_domain'],同时将完整的JWT payload写入其他对应env变量;
  5. 你控制器中引入的ShopifyApp::Authenticated concern会检查request.env['jwt.shopify_domain']是否存在且合法,存在则判定认证通过,否则直接返回401未授权错误。

内容的提问来源于stack exchange,提问作者aarkerio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:18:03