我正在构建一个包含日历的小型MERN堆栈应用程序。该日历的目的是将其与多个员工的谷歌日历同步,以便安排日程。

我已经开始测试Google Calendar API,当我直接使用Node运行它时,他们的测试代码工作正常:https://developers.google.com/calendar/api/quickstart/nodejs

然而,现在我正在尝试配置一个按钮,该按钮将触发从React到Express后端的请求,并点击一条路线(并使用后续的回调路线),以便授权员工(操作员)的工作谷歌帐户,并获取存储在数据库中的必要凭据。通过这种方式,应用程序可以保存每个操作员所需的身份验证和刷新令牌,以保持谷歌日历与应用程序的日历持续同步。这似乎不起作用,至少在我处于开发阶段时,出于某种原因,我一直收到这样的错误:

在“”处获取的访问权限(从“”重定向http://localhost:3500/api/auth/')来自原点'http://localhost:3000'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“access control Allow Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no cors”,以在cors被禁用的情况下获取资源。

我曾想过在前端完成这一切,并从那里将其发送到我的数据库,但这似乎不安全。

我建立了cors,我有http://localhost:3000'列为允许的来源,它适用于除此之外的所有其他内容。

我也尝试过使用代理,但我似乎无法让我的前端使用它。我尝试过http代理中间件包,我尝试过简单地添加“代理”:“http://localhost:3500“到我的package.json。这一切都不需要,控制台在我的服务器上记录请求源显示它们仍然来自localhost:3000。

我已经为此辛苦了一段时间了,我似乎无法克服它。

这是来自apiSlice的查询生成器(这在路由被明确调用时起作用。我认为问题实际上可能是我从auth重定向中得到的结果?):

`    getOperatorAuth: builder.query({
      query: (operatorEmail) => ({
        url:`/api/auth/${operatorEmail}`,
        validateStatus: (response, result) => {
          return response.status === 200 && !result.isError
        },
      }),
`

Here are the routes:

`const express = require('express')
const router = express.Router()
const operatorsController = require('../controllers/operatorsController')

router.route('/auth/:operatorEmail')
  .get(operatorsController.getGoogleAuth)

router.route('/callback')
  .get(operatorsController.getGoogleAuthCallback)

module.exports = router`

And here are the functions they call:

`const getGoogleAuth = async (req, res) => {
  console.log(req.headers.origin)
  console.log("requesting auth route")
  const operatorEmail = req.params.operatorEmail;
  const oAuth2Client = new OAuth2Client(clientId, clientSecret, redirectUri);
  const authorizeUrl = oAuth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: ['https://www.googleapis.com/auth/calendar'],
    state: JSON.stringify({ operatorEmail }),
  });
  res.redirect(authorizeUrl);
}

const getGoogleAuthCallback =async (req, res) => {
  console.log("google callback")
  const code = req.query.code;
  const state = JSON.parse(decodeURIComponent(req.query.state));
  const operatorEmail = state.operatorEmail;
  const data = querystring.stringify({
    code: code,
    client_id: clientId,
    client_secret: clientSecret,
    redirect_uri: redirectUri,
    grant_type: 'authorization_code'
  });
  const headers = {
    'Content-Type': 'application/x-www-form-urlencoded'
  };

  try {
    const response = await axios.post(
      'https://oauth2.googleapis.com/token',
      data,
      { headers: headers }
    );
    const accessToken = response.data.access_token;
    const refreshToken = response.data.refresh_token;

    // Store the access token and refresh token in MongoDB
    const operatorAuth = new OperatorAuth({
      email: operatorEmail,
      accessToken: accessToken,
      refreshToken: refreshToken
    });

    await operatorAuth.save();

    res.send('Access token and refresh token received and stored');
  } catch (error) {
    res.send(error.message);
  }

}`

本地主机上的Google API CORS错误;否';访问控制允许原点';请求的资源上存在标头";的更多相关文章

  1. CentOS 8.2服务器上安装最新版Node.js的方法

    这篇文章主要介绍了CentOS 8.2服务器上安装最新版Node.js的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. node.js三个步骤实现一个服务器及Express包使用

    这篇文章主要介绍了node.js三个步骤实现一个服务器及Express包使用,文章通过新建一个文件展开全文内容,具有一定的参考价值,需要的小伙伴可以参考一下

  3. Node.js调试技术总结分享

    Node.js是一个可以快速构建网络服务及应用的平台。该平台的构建是基于Chrome's JavaScript runtime,也就是说,实际上它是对Google V8引擎(应用于Google Chrome浏览器)进行了封装。 今天介绍Node.js调式目前有几种技术,需要的朋友可以参考下。

  4. node.js实现http服务器与浏览器之间的内容缓存操作示例

    这篇文章主要介绍了node.js实现http服务器与浏览器之间的内容缓存操作,结合实例形式分析了node.js http服务器与浏览器之间的内容缓存原理与具体实现技巧,需要的朋友可以参考下

  5. 教你如何使用node.js制作代理服务器

    本文介绍了如何使用node.js制作代理服务器,图文并茂,十分的详细,代码很简洁易懂,这里推荐给大家。

  6. node.js中的fs.openSync方法使用说明

    这篇文章主要介绍了node.js中的fs.openSync方法使用说明,本文介绍了fs.openSync方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下

  7. Node.js+ELK日志规范的实现

    这篇文章主要介绍了Node.js+ELK日志规范的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. node.js爬虫框架node-crawler初体验

    这篇文章主要介绍了node.js爬虫框架node-crawler的相关资料,帮助大家利用node.js进行爬虫,感兴趣的朋友可以了解下

  9. node.js中的fs.existsSync方法使用说明

    这篇文章主要介绍了node.js中的fs.existsSync方法使用说明,本文介绍了fs.existsSync方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下

  10. 说说如何利用 Node.js 代理解决跨域问题

    这篇文章主要介绍了Node.js代理解决跨域问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

随机推荐

  1. 如何扩展ATmega324PB微控制器的以下宏寄存器?

    我目前正在学习嵌入式,我有以下练习:展开以下宏寄存器:如果有人解决了这个问题,我将不胜感激,以便将来参考

  2. Python将ONNX运行时设置为返回张量而不是numpy数组

    在python中,我正在加载预定义的模型:然后我加载一些数据并运行它:到目前为止,它仍在正常工作,但我希望它默认返回Tensor列表,而不是numpy数组。我对ONNX和PyTorch都是新手,我觉得这是我在这里缺少的基本内容。这将使转换中的一些开销相同。

  3. 在macOS上的终端中使用Shell查找文件中的单词

    我有一个文本文件,其中有一行:我需要找到ID并将其提取到变量中。我想出了一个RexEx模式:但它似乎对我尝试过的任何东西都不起作用:grep、sed——不管怎样。我的一个尝试是:我为这样一个看似愚蠢的问题感到抱歉,但我在互联网上找不到任何东西:我在SO和SE上读了几十个类似的问题,并在谷歌上搜索了几个教程,但仍然无法找到答案。欢迎提供任何指导!

  4. react-chartjs-2甜甜圈图中只有标题未更新

    我正在使用react-chartjs-2在我的网站中实现甜甜圈图。下面是我用来呈现图表的代码。我将甜甜圈图的详细信息从父组件传递到子组件,所有道具都正确传递。当我在beforeDraw函数外部记录props.title时,它会记录正确的值,但当我在beforeDraw函数内部记录props.title时,它将记录标题的前一个值,从而呈现标题的前值。我在这里做错了什么?

  5. 如何在tkinter中使用Python生成器函数?

    生成器函数承诺使某些代码更易于编写。但我并不总是知道如何使用它们。假设我有一个斐波那契生成器函数fib(),我想要一个显示第一个结果的tkinter应用程序。当我点击“下一步”按钮时,它会显示第二个数字,依此类推。我如何构建应用程序来实现这一点?我可能需要在线程中运行生成器。但如何将其连接回GUI?

  6. 如何为每次提交将存储库历史记录拆分为一行?

    我正在尝试获取存储库的历史记录,但结果仅以单行文本的形式返回给我。

  7. 尝试在颤振项目上初始化Firebase时出错

    当尝试在我的颤振项目上初始化firebase时,我收到了这个错误有人知道我能做什么吗?应用程序分级Gradle插件Gradle项目颤振相关性我已经将firebase设置为Google文档已经在另一个模拟器上尝试过,已经尝试过创建一个全新的模拟器,已经在不同的设备上尝试过了,已经尝试了特定版本的firebase,已经尝试添加但没有任何效果,已经在youtube上看到了关于它的每一个视频,该应用程序在android和iOS两个平台上都抛出了这个错误

  8. 在unix中基于当前日期添加新列

    我试图在unix中基于时间戳列在最后一个单元格中添加一个状态列。我不确定如何继续。

  9. 麦克斯·蒙特利。我一直得到UncaughtReferenceError:当我在终端中写入node-v时,节点未定义

    如果这是您应该知道的,请确认:我已将所有shell更改为默认为zsh。当我在终端中写入node-v时,我一直收到“UncaughtReferenceError:nodeisnotdefined”。但它显示节点已安装。我是个新手,在这方面经验不足。

  10. 如何在前端单击按钮时调用后端中的函数?

    那么如何在后端添加一个新的端点,点击按钮调用这个函数。

返回
顶部