firebase - nuxt (SSR) 和 Firestore 规则的问题
问题描述
我将 Nuxt(通用模式)与 Firestore 一起使用,我正确设置了规则,但仍然出现此错误:
我得到缺少或不足的权限
当我重新加载页面时。通过路由器访问页面时,我没有收到任何错误,规则按预期工作。Firestore 在 asyncData 中被调用(因为它是一个 SSR 应用程序)。如果我在加载页面时检查 asynData 中的 req.user,一切看起来都很好。我有角色和所有信息。重新加载浏览器时,似乎在 asyncData 之后激活了 serverMiddleware。任何想法为什么?
我的 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,
},
},
},
},
}
解决方案
推荐阅读
- javascript - 如何仅使用 Jquery 编写按钮 html 代码?
- ios - MacOS x Flutter - “构建成功,但未找到预期的应用程序”
- java - Wildfly 模块类加载
- pytorch - TensorBoard 图例和标签轴
- python - 如何在python2.7中的字符串中嵌入一个字符串,其中已经转义了引号?
- javascript - 我有一个错误:找不到模块'./utils'
- python - 导入模块在终端中有效,但在 IDLE 中无效
- r - 在 R 中格式化 HTML 标题
- python - 将 Python 结果保存为 .txt 文件
- azure - 如何重命名 BLOB 容器中的文件