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