shopify - Shopify (Node + React) 自定义应用程序:verifyRequest() 问题
问题描述
我正在使用 Node+React 开发一个自定义嵌入式应用程序。
我遵循了官方教程,但是如果我使用 verifyRequest() 中间件,当我浏览我的应用程序页面时,我总是会收到以下错误:
需要有效的商店查询参数
我真的无法理解代码有什么问题。
有人可以帮我吗?
下面是 server.js 代码
require('isomorphic-fetch');
const dotenv = require('dotenv');
const Koa = require('koa');
const next = require('next');
const { default: shopifyAuth } = require('@shopify/koa-shopify-auth');
const { verifyRequest } = require('@shopify/koa-shopify-auth');
const { default: Shopify, ApiVersion } = require('@shopify/shopify-api');
const Router = require('koa-router');
const RedisSessionStorage = require('./middleware/RedisSessionStorage')
const Cookies = require('cookies')
dotenv.config();
Shopify.Context.initialize({
API_KEY: process.env.SHOPIFY_API_KEY,
API_SECRET_KEY: process.env.SHOPIFY_API_SECRET,
SCOPES: process.env.SHOPIFY_API_SCOPES.split(","),
HOST_NAME: process.env.SHOPIFY_APP_URL.replace(/https:\/\//, ""),
API_VERSION: ApiVersion.April21,
IS_EMBEDDED_APP: true,
SESSION_STORAGE: new Shopify.Session.CustomSessionStorage(
RedisSessionStorage.storeCallback,
RedisSessionStorage.loadCallback,
RedisSessionStorage.deleteCallback,
),
});
const port = parseInt(process.env.PORT, 10) || 3001;
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();
const ACTIVE_SHOPIFY_SHOPS = {[process.env.ACTIVE_SHOPIFY_SHOP]: process.env.SHOPIFY_API_SCOPES}
app.prepare().then(() => {
const server = new Koa();
const router = new Router();
server.keys = [Shopify.Context.API_SECRET_KEY];
server.use(
shopifyAuth({
accessMode: 'offline',
afterAuth(ctx) {
const { shop, scope, accessToken } = ctx.state.shopify;
global.accessToken = accessToken
ACTIVE_SHOPIFY_SHOPS[shop] = scope;
ctx.redirect(`/?shop=${shop}`);
},
}),
);
const handleRequest = async (ctx) => {
await handle(ctx.req, ctx.res);
ctx.respond = false;
ctx.res.statusCode = 200;
};
router.get("/", async (ctx) => {
const shop = ctx.query.shop;
if (ACTIVE_SHOPIFY_SHOPS[shop] === undefined) {
ctx.redirect(`/auth?shop=${shop}`);
} else {
await handleRequest(ctx);
}
});
router.get("(/_next/static/.*)", handleRequest);
router.get("/_next/webpack-hmr", handleRequest);
router.get("(.*)", verifyRequest({accessMode: 'offline'}), handleRequest);
server.use(router.allowedMethods());
server.use(router.routes());
server.listen(port, () => {
console.log(`> Ready on http://localhost:${port}`);
});
});
解决方案
您是否尝试过使用默认的 SESSION_STORAGE?看起来它正在指向 /auth
推荐阅读
- sql-server - 从 SQL Server 到 Excel 的不同日期时间格式
- batch-file - 如何使用 vbs 运行多个批处理并使用环境变量设置批处理文件路径?
- sql-server - 如何向 T_SQL 存储过程添加可选参数?
- javascript - React.js this2.setState 不是函数?
- r - div容器中的脚本
- node.js - 从基于文件夹的 npm 依赖项导入模块
- javascript - 如何在点列表中附加光滑的箭头?
- bash - 使用 AppleScript + bash 发送文件对象
- javascript - Highcharts:向面积折线图添加多种颜色
- mfc - 如何使用 pywinauto 自动将“.txt”文件从本地加载到 MFC 应用程序?