node.js - 使用 Cloud Functions for Firebase 时出现 CORS 错误
问题描述
这是我提出的第一个问题,如果格式不正确,我深表歉意。
我一直在试图弄清楚如何处理以下 CORS 错误以及 CORS 预检错误:
...已被 CORS 策略阻止:“Access-Control-Allow-Origin”标头的值“https://example.com/”不等于提供的来源。
在过去的几天里,我一直在阅读关于这个主题的每个问题,以及我在 CORS/Cloud Functions/Axios/etc 上可以找到的所有其他文档。我正在使用 React、Node、Express、Axios、Google Firebase 托管和 Google Cloud Functions。
我正在尝试访问 PayPal API 以获取不记名令牌以发出进一步的 API 请求。我了解与请求标头有关的一些代码可能是多余的。我一直在尝试对此扔任何东西。
有没有人有任何想法?
节点文件 - index.js
const axios = require("axios");
const express = require("express");
const cors = require("cors")({ origin: true });
const app = express();
app.use(cors());
app.use(express.json());
app.post("/v1/oauth2/token/", cors(), (req, res) => {
res.set("Access-Control-Allow-Origin", "https://example.com/");
var data = qs.stringify({
grant_type: "client_credentials",
});
var config = {
method: "post",
url: "https://api-m.sandbox.paypal.com/v1/oauth2/token/",
headers: {
"Access-Control-Allow-Origin": "https://example.com/",
Authorization:"xyz",
"Content-Type": "application/x-www-form-urlencoded",
},
data: data,
};
axios(config)
.then(function (response) {
let bearerToken = response.data.access_token;
res.status(201).send(bearerToken);
})
.catch(function (error) {
console.log(error);
});
});
exports.api = functions.https.onRequest(app);
反应文件 - payment.js
import axios from "../axios/axios";
const oneTimePaypalPayment = async () => {
const response = await axios.post("/v2/checkout/orders");
console.log(response);
};
axios 文件 - axios.js
import axios from "axios";
const instance = axios.create({
headers: {
"Access-Control-Allow-Origin": "https://example.com/",
"Access-Control-Allow-Headers": "https://example.com/",
},
baseURL: "https://us-central1-example.cloudfunctions.net/api/"
});
export default instance;
我试过的
我尝试使用通配符“*”只是为了让它工作但没有运气。我在另一个答案中读到 Google Cloud Functions 无论如何都无法识别“*”。我还尝试了下面的所有代码,以及许多其他方法来操作请求标头上的 Access-Control-Allow-Origin
const allowCrossDomain = function (req, res, next) {
res.header("Access-Control-Allow-Headers", "*");
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE");
next();
};
app.use(allowCrossDomain);
app.all("*", (req, res, next) => {
res.header("Access-Control-Allow-Headers", "*");
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE");
next();
});
const corsOptions = {
origin: "https://example.com/",
};
app.use(cors(corsOptions))
app.options("/v1/oauth2/token", cors(corsOptions));
app.use(cors({origin:true}));
任何想法将不胜感激
解决方案
在您正在导出或使用以下用于 Origin 的云功能中:
exports.your function = async (req, res) => {
res.set('Access-Control-Allow-Origin', '*');
推荐阅读
- libgdx - Libgdx freetypefont 不显示右边框颜色
- python-3.x - 从 .txt 文件中提取文本并保存到带有列和标题的 .csv 文件中
- r - 如何在 R 或 Python 中将县 FIPS 转换为经纬度坐标?
- c# - 在运行时更改 MVC 中的验证消息
- system-verilog - 为什么 uvm_tlm_fifo 需要 put_export 和 get_peek_export?
- macos - 在 MacOS 上将 OpenSSL 更新到 1.1.1
- csv - 如何修复 java.io.IOException:(第 1 行)封装的令牌和带有 Spark Dataframe 的分隔符之间的无效字符
- reactjs - MaterialUI TextField 使用文本转换选择
- java - 使用 Spring Boot Security 在 REST API 中强制执行正确的 API 密钥和 JWT 用户令牌
- node.js - 这是令牌认证的更好方法。JWT 或任何其他方法