【发布时间】:2019-04-01 23:52:42
【问题描述】:
我在 Firebase Functions 中设置了一个 Node Express 应用程序,在 Firebase Hosting 中设置了一个 React 应用程序(类似于我构建的 template,除了我在 express 中配置了会话 cookie 并且我正在使用护照JS)。
我的firebase.json 包含以下内容:
{
"hosting": {
"public": "build",
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
"rewrites": [
{
"source": "/api/**",
"function": "app"
}
]
}
}
如果我使用完整的绝对 API url 从 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?
【问题讨论】: