Javascript 如何在对Google oAuth的服务帐户调用中处理CORS?

Javascript 如何在对Google oAuth的服务帐户调用中处理CORS?,javascript,google-api,cors,google-oauth,Javascript,Google Api,Cors,Google Oauth,我使用服务帐户访问谷歌日历。这意味着不会提示日历所有者进行授权 这在Python中工作得很好,我对https://accounts.google.com/o/oauth2/token具有特定的主体。这给了我一个代币,我以后可以用 我现在需要一个在独立浏览器中运行的应用程序(Chrome-无需用户交互),并尝试将此调用直接移植为 fetch('https://accounts.google.com/o/oauth2/token', { method: 'POST',

我使用服务帐户访问谷歌日历。这意味着不会提示日历所有者进行授权

这在Python中工作得很好,我对
https://accounts.google.com/o/oauth2/token
具有特定的主体。这给了我一个代币,我以后可以用

我现在需要一个在独立浏览器中运行的应用程序(Chrome-无需用户交互),并尝试将此调用直接移植为

fetch('https://accounts.google.com/o/oauth2/token',
    {
        method: 'POST',
        body: JSON.stringify(body),
    })
    .then(function(res) { return res.json(); })
    .then(function(data) { alert(JSON.stringify(data)) })
但我得到了谷歌的回复

未能加载:否 “Access Control Allow Origin”标头出现在请求的服务器上 资源。因此,不允许访问源“”。这个 响应的HTTP状态代码为400。如果一个不透明的回答符合你的要求 如果需要,请将请求的模式设置为“no cors”以获取资源 CORS残疾

我对CORS的有限理解(a是一本非常好的读物)是

请求的服务器上不存在“Access Control Allow Origin”标头 资源

这意味着它不存在于响应标题中,这意味着谷歌不希望我在从浏览器运行时通过JS访问其资源(这指向
https://accounts.google.com

这可能是一个好主意,但我控制所有元素,从代码到浏览器,并希望以与在非浏览器环境(特别是我的工作Python代码)中获得该标记相同的方式获得该标记

我如何分辨
https://accounts.google.com
向我发回一个
访问控制允许来源
标题,告诉我的浏览器可以接受呼叫?

你不能

客户端和服务器端代码需要以不同的方式与OAuth交互

谷歌

重要的是,它的一部分涉及重定向到谷歌的服务器,而不是使用
fetch
XMLHttpRequest
访问它们,你不能这样做

客户端和服务器端代码需要以不同的方式与OAuth交互

谷歌

重要的是,它的一部分涉及重定向到谷歌的服务器,而不是使用
fetch
XMLHttpRequest

@Quentin的回答“你不能”是解决我的问题的正确答案(“我如何才能强制服务器发回正确的头”)

这是谷歌决定不提供此标题,有效地切断了任何非交互式应用程序

作为解决方案,我将研究

  • 如何强制浏览器不考虑CORS提供的安全机制(通过扩展或命令行参数似乎有一些方法,我会在找到答案后更新)
  • 或者编写一个中间层,为我查询数据,并将其逐字传递给应用程序(在我的例子中,这相当于从JS进行查询,但它增加了一层额外的代码和服务器)
@Quentin的回答“你不能”是我问题的正确答案(“我如何才能强制服务器发回正确的标题”)

这是谷歌决定不提供此标题,有效地切断了任何非交互式应用程序

作为解决方案,我将研究

  • 如何强制浏览器不考虑CORS提供的安全机制(通过扩展或命令行参数似乎有一些方法,我会在找到答案后更新)
  • 或者编写一个中间层,为我查询数据,并将其逐字传递给应用程序(在我的例子中,这相当于从JS进行查询,但它增加了一层额外的代码和服务器)

我不明白的是,从python中,我可以拨打需要用户授权的电话(通过复制粘贴作为响应接收的链接),或者拨打不需要交互授权的服务帐户类型的电话(提供给服务帐户上游)。为什么不用JS?上下文是相同的(无需人工访问数据)和请求帐户的相同权限。我阅读了您提供的链接,它非常棒,与python版本的文档中的链接非常相似(明确的用户授权也可能是一个选项),此外,安全方面的影响是没有的——我将最终编写一个python层,它将请求、服务帐户样式和数据,并将它们逐字地提供给我的JS代码。这可能直接发生在JS中(我不是在抱怨,只是试图理解其原理)在JS中,您无法向用户隐藏授权详细信息-因此您必须在JS代码中提供密钥等。而且,由于使用您的页面的任何人(包括机器人)都可以查看浏览器代码并调试变量值,因此您的密钥不再是机密的。这就是为什么你不能使用JS的服务帐户,据我所知。而Oauth在JS中很好,因为你要求用户自己提供他们的凭据,而不是你的凭据。@ADyson:这些都是公平的观点-但在我的情况下,我控制代码和浏览器(这是一个信息亭或仪表板类的应用程序)。我不明白的是,从python中,我可以进行需要用户授权的调用(通过复制粘贴作为响应接收的链接)或在不需要交互授权的情况下进行服务帐户类型的调用(提供给服务帐户上游)。为什么不在JS中?上下文是相同的(无需人工访问数据)我阅读了您提供的链接,它非常棒,与python版本的文档中的链接非常相似(在python版本中,明确的用户授权也可能是一个选项)此外,安全方面的影响是没有的——我将最终编写一个python层,它将请求、服务帐户样式和数据,并将它们逐字地提供给我的JS代码