Я следил за этим руководством по созданию приложения publi c Shopify с использованием Node, Next js и React.
Все идет хорошо, но я сейчас я нахожусь в точке, где мне нужно сохранить некоторые данные моего приложения в базе данных. Для этого я выбрал Firestore.
То, что я делаю, это когда пользователь аутентифицирует приложение в своем магазине, я использую Admin-SDK на моем сервере Next JS для записи своего магазина и accessToken в документ:
Примечание. Я использую режим доступа "offline", поскольку мне нужен постоянный токен доступа, чтобы мое приложение могло выполнять запросы Shopify API в фоновом режиме. Я также знаю, что мне действительно нужно зашифровать accessToken перед его сохранением, но я просто пытаюсь заставить logi c работать первым
server.use(
createShopifyAuth({
apiKey: SHOPIFY_API_KEY,
secret: SHOPIFY_API_SECRET_KEY,
scopes: ['read_products', 'write_products'],
accessMode: "offline",
async afterAuth(ctx) {
const {shop, accessToken} = ctx.session;
ctx.cookies.set('shopOrigin', shop, {
httpOnly: false,
secure: true,
sameSite: 'none'
});
await getSubscriptionUrl(ctx, accessToken, shop);
await db.collection('shops').doc(shop).set({
name: shop,
accessToken
}, {merge: true});
},
}),
);
Я также использую промежуточное программное обеспечение Koa, которое проверяет любые запросы на мое приложение, чтобы убедиться, что они из приложения Shopify
server.use(verifyRequest());
Теперь я хочу добавить способ для моего приложения извлекать данные из Firebase. Я создал конечную точку api в /pages/api/firebase.js
, которая использует shopOrigin
cook ie для получения имени магазина, а затем извлекает данные для этого магазина.
export default async(req, res) => {
const shop = req.cookies.shopOrigin;
const doc = await db.collection('shops').doc(shop).get()
res.status(200).json({success: true, data: doc.data()});
}
Проблема, которую я Тем не менее, пользователь может просто изменить это значение файлов cookie и получить данные для другого магазина. Функция verifyRequest
, похоже, не проверяет, принадлежит ли вызывающее ее имя shopOrigin из магазина, который ее вызывает.
Кто-нибудь знает, как я могу проверить эти запросы, чтобы магазин, вызывающий мой API, мог только доступ для хранения данных (через admin-sdk на сервере Next)?