Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Firebase进行Shopify身份验证?_Javascript_Node.js_Firebase_Shopify_Next.js - Fatal编程技术网

Javascript 使用Firebase进行Shopify身份验证?

Javascript 使用Firebase进行Shopify身份验证?,javascript,node.js,firebase,shopify,next.js,Javascript,Node.js,Firebase,Shopify,Next.js,我一直在学习如何使用Node、Nextjs和React构建公共Shopify应用程序的教程 一切都进展顺利,但我现在需要将我的一些应用程序数据存储在数据库中。为此,我选择了Firestore 我正在做的是,当用户使用他们的应用商店验证应用程序时,我在下一个JS服务器中使用Admin SDK将他们的应用商店和accessToken写入文档: 注意:我离线使用accessMode,因为我需要一个永久访问令牌,以便我的应用程序可以在后台发出Shopify API请求。我还知道,我应该在存储access

我一直在学习如何使用Node、Nextjs和React构建公共Shopify应用程序的教程

一切都进展顺利,但我现在需要将我的一些应用程序数据存储在数据库中。为此,我选择了Firestore

我正在做的是,当用户使用他们的应用商店验证应用程序时,我在下一个JS服务器中使用Admin SDK将他们的应用商店和accessToken写入文档:

注意:我离线使用accessMode,因为我需要一个永久访问令牌,以便我的应用程序可以在后台发出Shopify API请求。我还知道,我应该在存储accessToken之前对它进行加密,不过我只是想先让逻辑工作起来

<>我也使用膝关节炎中间件来验证我的应用程序的任何请求,以确保它们来自SualEngPapp

server.use(verifyRequest());
我现在想做的是为我的应用程序添加一种从Firebase提取数据的方法。我在/pages/api/firebase.js中创建了一个api端点,它使用shopOrigin cookie获取商店名称,然后提取该商店的数据

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()});
    }
不过,我面临的问题是,用户只需更改cookies值并为另一个存储提取数据。verifyRequest函数似乎不会检查调用它的shopOrigin名称是否来自调用它的商店


有人知道我如何验证这些请求,以便调用我的API的存储只能通过下一台服务器上的admin sdk访问存储数据的存储吗?

考虑到这一点,我可以使用自定义身份验证方法

在下一个server.js文件中,下面的将使用商店名称创建一个自定义令牌,然后在cookie中设置该令牌。例如,它然后在shops集合中创建一个文档,文档ID作为商店名称

async afterAuth(ctx) {
    const {shop, accessToken} = ctx.session;

    await getSubscriptionUrl(ctx, accessToken, shop);

    const customToken = await admin.auth().createCustomToken(shop)

    ctx.cookies.set('shopOrigin', shop, {
        httpOnly: false,
        secure: true,
        sameSite: 'none'
    });

    ctx.cookies.set('token', customToken, {
        httpOnly: false,
        secure: true,
        sameSite: 'none'
    });

    await db.collection('shops').doc(shop).set({
        domain: shop,
        token: cryptr.encrypt(accessToken),
    }, {merge: true});
}, 
在React应用程序中,初始化Firebase应用程序实例,然后在index.js中侦听以查看authState是否已更改或用户是否使用令牌登录

useEffect(() => {
    firebase.auth().onAuthStateChanged(user => {
        if(user) {
            setSignedIn(true)
        } else {
            firebase.auth().signInWithCustomToken(Cookies.get('token'));
        }
    })
},[])
然后在Firebase规则中,根据需要设置您的权限

match /shops/{shop}/{documents=**} {
    allow read, write: if request.auth != null && request.auth.uid == shop
}

你在哪里调用admin.initializeApp?@K20GH真棒,但是我遇到了一个问题,管理员尚未初始化-你在哪里调用/导入它?
match /shops/{shop}/{documents=**} {
    allow read, write: if request.auth != null && request.auth.uid == shop
}