Firebase nuxt(SSR)和firestore规则存在问题

Firebase nuxt(SSR)和firestore规则存在问题,firebase,google-cloud-firestore,nuxt.js,server-side-rendering,Firebase,Google Cloud Firestore,Nuxt.js,Server Side Rendering,我在Firestore中使用Nuxt(通用模式),我正确设置了规则,但仍然出现以下错误: 我缺少或权限不足 当我重新加载页面时。当通过路由器访问页面时,我没有收到任何错误,规则按预期工作。 Firestore在asyncData中调用(因为它是一个SSR应用程序)。 如果我在加载页面时在Asynada中检查req.user,一切看起来都很好。我有角色和所有信息。在重新加载浏览器时,服务器中间件似乎在异步数据之后被激活。你知道为什么吗 我的Firestore规则: service cloud.fi

我在Firestore中使用Nuxt(通用模式),我正确设置了规则,但仍然出现以下错误:

我缺少或权限不足

当我重新加载页面时。当通过路由器访问页面时,我没有收到任何错误,规则按预期工作。 Firestore在asyncData中调用(因为它是一个SSR应用程序)。 如果我在加载页面时在Asynada中检查req.user,一切看起来都很好。我有角色和所有信息。在重新加载浏览器时,服务器中间件似乎在异步数据之后被激活。你知道为什么吗

我的Firestore规则:

service cloud.firestore {
  match /databases/{database}/documents {
    function isApplicant() {
       return request.auth.token.roles.applicant == true
    }
    match /tests/{test} {
       allow read: if isApplicant();
    }
  }
}
服务器中间件:

const admin = require('../services/firebase-admin-init.js')
const cookieParser = require('cookie-parser')();
global.XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest

module.exports = async function (req, res, next) {
    await getIdTokenFromRequest(req, res).then(idToken => {
        if (idToken) {
            addDecodedIdTokenToRequest(idToken, req).then(() => {
                next();
            });
        } else {
            next();
        }
    });
}

function getIdTokenFromRequest(req, res) {
    if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
        return Promise.resolve(req.headers.authorization.split('Bearer ')[1]);
    }
    return new Promise(function(resolve) {
        cookieParser(req, res, () => {
            if (req.cookies && req.cookies.__session) {
                console.log("new")
                console.log('Found "__session" cookie');
                // Read the ID Token from cookie.
                resolve(req.cookies.__session);
            } else {
                resolve();
            }
        });
    });
}

/**
 * Returns a Promise with the Decoded ID Token and adds it to req.user.
 */
function addDecodedIdTokenToRequest(idToken, req) {
    // console.log('Start addDecodedIdTokenToRequest')
    return admin.auth().verifyIdToken(idToken).then(decodedIdToken => {
        console.log('ID Token correctly decoded', decodedIdToken);
        req.user = decodedIdToken;
    }).catch(error => {
        console.error('Error while verifying Firebase ID token:', error);
    });
}
Nuxt配置文件:

const path = require('path');
const environment = process.env.NODE_ENV || 'development';
const envSet = require(`./config/env.${environment}.js`);

module.exports = {
    env: envSet,
    mode: 'universal',
    plugins: [
        { src: '~/plugins/fireinit.js', ssr: false,  },
        { src: '~/plugins/auth-cookie.js', ssr: false },
        { src: '~/plugins/fireauth.js', ssr: false }
    ],
    router: {
    },
    serverMiddleware: [
        '~/serverMiddleware/validateFirebaseIdToken'
    ],
    modules: [
        'vue-scrollto/nuxt',
        ['nuxt-validate', {
            lang: 'ja'
        }],
        '@nuxtjs/axios',
    ],
    css: [
        {src: '~/assets/scss/app.scss', lang: 'scss'}
    ],
    /*
    ** Customize the progress bar color
    */
    loading: { color: '#403a8f' },
    resolve: {
        extensions: ['.js', '.json', '.vue', '.ts'],
        root: path.resolve(__dirname),
        alias: {
            '~': path.resolve(__dirname),
            '@': path.resolve(__dirname)
        },
    },
    /*
    ** Build configuration
    */
    buildDir: '../cloud/front/',
    build: {
        publicPath: '/assets/',
        extractCSS: true,
        quiet: false,

        terser: {
            terserOptions: {
                compress: {
                    drop_console: environment === 'production' ? true : false,
                },
            },
        },
    },
}

你有没有想过?我也有同样的问题,你有没有想过?我也有同样的问题。