React/Node/Express 和 google OAuth 的 CORS/CORB 问题

2023-12-13

我有一个 React 应用程序,我正在尝试使用 OAuth 添加 Node/Express/MySQL 后端。我的 React 应用程序托管在 localhost:3000 上,而 Express 服务器位于 localhost:4000 上。我添加了“代理”:”http://本地主机:4000" 到 React 应用程序的 package.json 文件以将请求发送到服务器。OAuth 的授权 Javascript 来源是http://本地主机:4000。授权重定向 URI 是http://localhost:4000/auth/google/redirect.

这些是当我尝试访问服务器上的路由时在浏览器控制台中遇到的错误:

有人说请求的资源上不存在“Access-Control-Allow-Origin”标头。

另一个说“跨源读取阻止 (CORB) 阻止了跨源响应......MIME 类型为 text/html。”

我不知道我做错了什么,从昨天开始我就被困住了。

Failed to load https://accounts.google.com/o/oauth2/v2/auth?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A4000%2Fauth%2Fgoogle%2Fredirect&scope=profile&client_id={clientiddeletedbyme}.apps.googleusercontent.com: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.   

Cross-Origin Read Blocking (CORB) blocked cross-origin response https://accounts.google.com/o/oauth2/v2/auth?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A4000%2Fauth%2Fgoogle%2Fredirect&scope=profile&client_id={iddeletedbyme}apps.googleusercontent.com with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.

这是我的 React 应用程序的 package.json 文件中的代码:

{
  "name": "workout_tracker",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "axios": "^0.18.0",
    "firebase": "^5.3.0",
    "jw-paginate": "^1.0.2",
    "jw-react-pagination": "^1.0.7",
    "normalize.css": "^8.0.0",
    "random-id": "0.0.2",
    "react": "^16.5.2",
    "react-dom": "^16.5.2",
    "react-headroom": "^2.2.2",
    "react-icons-kit": "^1.1.6",
    "react-redux": "^5.0.7",
    "react-router-dom": "^4.3.1",
    "react-scripts-cssmodules": "^1.1.10",
    "react-swipe-to-delete-component": "^0.3.4",
    "react-swipeout": "^1.1.1",
    "redux": "^4.0.0",
    "redux-thunk": "^2.3.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  },
  "devDependencies": {
    "redux-devtools-extension": "^2.13.5"
  },
  "browserslist": [
    ">0.2%",
    "not dead",
    "not ie <= 11",
    "not op_mini all"
  ],
  "proxy":"http://localhost:4000"
}

这是我的 React 应用程序中将请求发送到服务器的代码:

express=()=>{
axiosInstance.get("/google").then(res=>{
  console.log(res);
}).catch(err=>console.log(err));
}

这是服务器中的代码

   let express = require("express");
let cors= require("cors");
let mysql = require("mysql");
const util = require("util");
const passportSetup = require("./config/passport-setup");
const passport = require("passport");

let app = express();

let connection =mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "root",
    database: "Workout_Tracker",
    socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock'
});



app.use(cors(
{origin:"http://localhost:3000",
    credentials:true,
    allowHeaders:"Content-Type"
}
));

app.options("/google", cors());
app.get("/google", cors(), passport.authenticate("google",{

    scope:['profile']

}));

...omitted a bunch of SQL queries

app.listen(4000, () => console.log("Listening on port 4000!"));

这是您需要安装的新中间件的示例代码以表达BEFORE您定义任何路线:

const cors = require('cors');

app.use('*', function(req, res, next) {
//replace localhost:8080 to the ip address:port of your server
res.header("Access-Control-Allow-Origin", "http://localhost:8080");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header('Access-Control-Allow-Credentials', true);
next(); 
});

//enable pre-flight
app.options('*', cors());

但在复制和粘贴之前,让您知道您需要npm install cors --save在导入 cors 之前。上面的示例代码简单的意思就是:

  1. 我们允许不同的 IP 地址访问您定义的所有路由的服务器
  2. 允许标头内包含“X-Requested-With”和“Content-Type”参数。您通常不必具体定义这些,但拥有它们是件好事。
  3. 只有将允许凭据设置为 true,您的会话/cookie 才能在前端刷新页面期间存储,我认为这可能对您未来的开发有所帮助。
  4. 飞行前请求也将被允许,许多 Http 库将默认发送该请求。
  5. 对于你的前端,如果你使用 axios,你确实需要:axios.create({ withCredentials: true });话说:react和express都同意使用CORS。其他 http 库也是如此。

以下是一些您可以查看的文档:https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React/Node/Express 和 google OAuth 的 CORS/CORB 问题 的相关文章

  • 带有 nextjs 的 Material-ui 选项卡?

    我有一个 Material ui nextjs 和 typescript 项目 我正在尝试让我的导航栏与 nextjs 一起使用 import as React from react import AppBar from material
  • React Router LINK不传递参数

    我有一个 React 有声读物搜索应用程序 它按作者姓氏从 Librivox 获取数据并显示书籍列表 列表中的每个项目都有一个链接 该链接依次转到显示的单独的完整图书数据组件 该特定书籍 或用户从列表中选择的任何书籍 的所有数据 在我的一生
  • useRef 和普通变量的区别

    我想知道这两个代码之间的区别 1 import React from react import ReactDOM from react dom function App const myref React useRef 0 2 import
  • 如何在 NextJS 中记录所有路由

    我对 NextJS 非常陌生 我目前有一个非常简单的应用程序 它提供少量页面 如果路由不存在 则返回 404 页面 我想记录每个请求 包括不存在的页面并返回 404 页面 我正在 docker 容器内运行该应用程序 或者我希望将日志写入标准
  • 如何在浏览器中实现HTTP/2流连接?

    如今 HTTP 2 的性能正在不断提高 最新版本的 Node js 很好地支持了 HTTP 2 https nodejs org api http2 html https nodejs org api http2 html 但我不知道如何在
  • React Native:uri 图像未显示在 Android 上,但显示在 iOS 模拟器上

    我正在开发一个反应本机应用程序 我正在从 API 获取一些图像并将它们显示为平面列表 问题是这些图像在iOS模拟器上但不显示Android模拟器 我已经设置了图像的宽度和高度 但问题仍然相同 这是下面的代码 成分
  • 由于 useEffect 重新渲染而导致图表重复

    我有一个父组件 我用它来传递道具 即backgroundColor 到子组件
  • Nginx Node.js 快速下载大文件止于 1.08GB

    我有这个由 Nginx 代理的 Node js 应用程序 在生产环境中 路线是这样的 exports download function req res var id req params id if id id latest res do
  • process.stdout.on( 'data', ... ) 和 process.stderr.on( 'data', ... ) 的顺序

    我正在编写一个电子应用程序 该应用程序处理从电子内部执行的终端命令 我在执行时遇到了麻烦npm ls命令 从 cli 运行它时 依赖关系树会打印到 stdout 最后可能会出现一些来自 stderr 的警告 请参阅下面的屏幕截图 正确输出
  • 下一个验证 |当用户对象有太多项目时,会话请求没有数据

    我会尽力为我解释我的问题 我使用 Strapi 作为后端 使用 Nextjs 作为前端 对于身份验证 我使用 NextAuth nextauth js const options providers Providers Credential
  • EJS.JS ReferenceError:标题未定义

    我遇到了 Express 脚本的问题 我正在调用一个在另一个函数成功时呈现视图的函数 在这个项目中 我使用 Angular Node Express 和 ejs 作为视图引擎 当我渲染视图时 不幸的是我收到以下 ejs 错误 Referen
  • React Native 入门项目捆绑失败并出现意外令牌错误

    我正在尝试使用以下说明创建我的第一个适用于 Android 的 React Native 应用程序https facebook github io react native docs getting started html https f
  • 未知错误:SyntaxError:ng 命令上出现意外的标记“导出”

    我正在尝试学习 Angular我已按照此处的步骤操作 https angular io guide setup local https angular io guide setup local在 Ubuntu 18 04 5 LTS 上进行
  • MongoDB:如何在更新之前对查询进行排序

    我正在编写一个 Meteor Node js 应用程序 它在后端使用 MongoDB 在我的代码中的某个时刻 我需要更新specific集合中的文档 我需要使用 Mongo 的 update 方法 但我在传递正确的 复杂的 查询以缩小到该特
  • npm 错误! asyncWrite 不是一个函数

    npm 安装 g firebase tools npm 错误 asyncWrite 不是一个函数 npm 错误 pna nextTick 不是函数 npm 错误 此运行的完整日志可以在以下位置找到 npm 错误 home developer
  • MongoDB $lookup 对一个文档的对象数组进行查找

    我在网上搜索过 但找不到与我的情况相符的内容 情况是这样的 我正在使用聚合将一个集合和来自另一个集合的一个文档组合在一起 restaurants aggregate match id in idList lookup from tags l
  • node-postgres 不会插入数据,但也不会抛出错误

    我正在使用节点 postgres https github com brianc node postgresnode js 的模块 我在插入数据时遇到问题 功能 function addItems listId listItems hand
  • Mongodb 的 Mongoose 与 Mongoose

    我正在学习 NodeJ 要从 NodeJS 连接并使用 MongoDB 我看到很多使用 Monk 或 Mongoose 的示例 这两个库等效吗 它们具有相同的功能还是都有特定的用途 作为 NodeJS 的初学者 我应该使用哪个 以下是使用
  • 将 JSON var 从路由传递到 ejs

    我在express EJS中有一些代码 1 在 app js 中 创建 mongo 集合对象 app locals userCollection db get userData 2 在user js快速路由文件中 我从这个数据库连接获取数据
  • 在reactjs中停止超时?

    有没有办法可以杀死 摆脱 reactjs 中的超时 setTimeout function do something bind this 3000 通过某种点击或操作 我希望能够完全停止并结束超时 有没有办法做到这一点 谢谢 假设这种情况发

随机推荐