【问题标题】:How to set "Access-Control-Allow-Credentials" in Firebase hosting如何在 Firebase 托管中设置“Access-Control-Allow-Credentials”
【发布时间】: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?

【问题讨论】:

    标签: reactjs firebase express


    【解决方案1】:

    您可以将此代码包含在您的快速配置中。 这将解决 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();
    });
    

    【讨论】:

    • 感谢您的回答。但是,express 服务器没有问题,因为直接从 React 应用程序向 API 发出的请求可以正常工作。问题是当我从 React 应用程序向 /api/** 发出提取请求时,Firebase 通过重写规则代理到函数 app
    猜你喜欢
    • 2015-04-14
    • 2016-03-15
    • 2019-12-14
    • 2016-01-21
    • 2022-10-13
    • 2022-01-17
    • 2019-01-18
    • 2018-05-13
    • 2017-06-24
    相关资源
    最近更新 更多