如何在服务帐户调用 Google oAuth 时处理 CORS?

WoJ*_*WoJ 2 javascript google-api cors google-oauth

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

这在 Python 中工作得很好,我在其中使用特定的主体进行requests调用。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)) })
Run Code Online (Sandbox Code Playgroud)

但我得到了谷歌的回复

无法加载https://accounts.google.com/o/oauth2/token:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问来源“ http://devd.io ”。响应的 HTTP 状态代码为 400。如果不透明响应满足您的需求,请将请求的模式设置为“no-cors”以在禁用 CORS 的情况下获取资源。

我对 CORS 的有限理解(之前的答案非常好读)是

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

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

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

我怎样才能告诉https://accounts.google.com我发回一个Access-Control-Allow-Origin标头,告诉我的浏览器可以接受呼叫?

Que*_*tin 5

你不能。

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

Google提供解释客户端流程的文档

重要的是,其中一部分涉及重定向到 Google 的服务器,而不是使用fetch或访问它们XMLHttpRequest