我已经在Firebase Functions中设置了Node Express应用程序,并在Firebase Hosting中设置了React应用程序(类似于我构建的template,但我已经在express和m使用Passport JS)。
我的firebase.json
包含以下内容:
{
"hosting": {
"public": "build",
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
"rewrites": [
{
"source": "/api/**",
"function": "app"
}
]
}
}
如果我使用完整的绝对API网址从React应用直接向API提取请求,那么一切都会正常进行:
try {
const url = 'https://us-central1-[my-app-name]-app.cloudfunctions.net/app/api/v1.0/auth/status';
const response = await fetch(url,
{
method: 'GET',
credentials: 'include',
headers: {
'Content-Type': 'application/json',
},
}
);
json = await response.json();
console.log(json); // {"isAuthenticated":true}
} catch (error) {
throw error;
}
API检查会话中是否存在用户,并相应地返回响应。
但是,如果我尝试通过firebase.json
文件中配置的重写代理访问API,仅使用相对URL /api/v1.0/auth/status
,那么我仍然会收到响应(确认Firebase代理相应的请求),但isAuthenticated
标志设置为false,而不是true。
我认为这是因为代理请求缺少我有价值的“ withCredentials”标头,因此我也在firebase.json
文件中设置了此标头:
{
"hosting": {
"public": "build",
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
"rewrites": [
{
"source": "/api/**",
"function": "app"
}
],
"headers": [
{
"source": "/api/**",
"headers": [
{
"key": "Access-Control-Allow-Credentials",
"value": "true"
},
{
"key": "Content-Type",
"value": "application/json"
}
]
}
]
}
}
但是,这似乎没有效果。有什么我想念的吗?
编辑:经过仔细检查,我相信这是因为当Firebase代理请求时,cookie头没有被传递到功能应用程序中(不需要提供“凭据”头,因为它不是跨域),所以我认为必须有某种方法告诉Firebase在重写/代理请求中包含cookie?
答案 0 :(得分:0)
您可以在快速配置中包含此代码。 这样可以解决cors问题
// allow-cors
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
next();
});