基于Shopify客户账号的NodeJS API移动端认证方案咨询
基于Shopify客户账号的认证方案实现
核心思路
利用Shopify官方的客户账户OAuth 2.0流程验证客户身份,通过你的NodeJS服务完成Shopify回调校验、客户信息获取,最后签发自身API使用的JWT令牌,供移动端访问你的API。
具体实现步骤
1. 配置Shopify店铺的客户OAuth权限
- 登录Shopify后台,进入「设置」→「应用和销售渠道」→「开发应用」,创建自定义应用
- 在「配置API范围」中找到「Customer account API」,勾选
read_customers权限(需修改客户信息可额外勾选write_customers) - 进入「应用设置」→「客户账户OAuth设置」,添加你的NodeJS服务回调地址(例如
https://your-api-domain.com/auth/shopify/customer/callback) - 记录好客户账户OAuth客户端ID和客户端密钥(注意区分Shopify Admin API的密钥,这是专门用于客户认证的密钥)
2. 移动端触发认证跳转
- 构造Shopify客户授权URL,参数如下:
https://{你的店铺域名}/account/oauth/authorize ?client_id={客户OAuth客户端ID} &redirect_uri={你的回调地址} &scope=read_customers &response_type=code &state={随机生成的防CSRF字符串} - 移动端通过WebView或系统浏览器打开该URL,用户将进入Shopify官方登录页面,输入自身账号密码完成登录并授权
3. NodeJS服务处理回调并签发JWT
- 接收Shopify回调的
code和state参数,首先验证state与移动端发起请求时生成的随机串一致,防止CSRF攻击 - 用
code向Shopify请求访问令牌:// 示例:用axios发送请求 const axios = require('axios'); const tokenRes = await axios.post(`https://${你的店铺域名}/account/oauth/token`, { client_id: process.env.SHOPIFY_CUSTOMER_OAUTH_CLIENT_ID, client_secret: process.env.SHOPIFY_CUSTOMER_OAUTH_CLIENT_SECRET, code: req.query.code, redirect_uri: process.env.SHOPIFY_CUSTOMER_OAUTH_REDIRECT_URI, grant_type: 'authorization_code' }); const shopifyAccessToken = tokenRes.data.access_token; - 用获取到的
shopifyAccessToken调用Shopify客户API获取当前用户信息:const customerRes = await axios.get(`https://${你的店铺域名}/account/api/2024-07/me`, { headers: { 'Authorization': `Bearer ${shopifyAccessToken}`, 'Content-Type': 'application/json' } }); const customerInfo = customerRes.data.customer; - 验证客户信息有效后,签发你的API所用JWT:
const jwt = require('jsonwebtoken'); const apiJwtToken = jwt.sign( { customerId: customerInfo.id, email: customerInfo.email }, process.env.YOUR_JWT_SECRET, { expiresIn: '24h' } ); - 将JWT传递给移动端:可以通过回调页面的JS跳转到APP自定义Scheme(例如
yourapp://auth/success?token=${apiJwtToken}),或直接在WebView中把令牌传递给原生代码
4. 移动端访问你的API
- 移动端拿到JWT后,在后续请求你的NodeJS API时,将令牌放在请求头:
Authorization: Bearer {apiJwtToken} - 你的API现有JWT认证层直接校验该令牌有效性,通过后允许访问资源
关键注意点
- 必须校验
state参数,避免跨站请求伪造 - Shopify API版本需使用当前支持的稳定版本(示例中为2024-07),注意定期更新
- 可实现令牌刷新逻辑:Shopify OAuth返回的
refresh_token可用于获取新的Shopify access token,进而重新签发你的JWT,避免用户频繁重新登录
内容的提问来源于stack exchange,提问作者Chinthaka Dinadasa
相关产品推荐
相关产品推荐

