如何在Firebase托管中设置“访问控制权限凭据”

时间:2018-10-29 04:47:27

标签: reactjs firebase express

我已经在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?

1 个答案:

答案 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();
});