如何处理Google oAuth的服务帐户调用中的CORS?
我使用服务帐户访问Google日历。这意味着日历的所有者不会被提示授权。如何处理Google oAuth的服务帐户调用中的CORS?
这在Python中正常工作,我用requests
调用https://accounts.google.com/o/oauth2/token
与一个特定的主体。这让我回到了以后可以使用的令牌。
我现在需要有一个独立的浏览器中运行的应用程序(铬 - 无需用户交互),并试图直接端口此调用作为
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)) })
,但我从谷歌
回复未能加载https://accounts.google.com/o/oauth2/token:否 “访问控制允许来源”标题存在于所请求的资源 。因此不允许访问原产地'http://devd.io'。该 响应了HTTP状态代码400。如果不透明响应提供您的 需求,设置请求的模式,以“无CORS”获取禁用 CORS的资源。
我有限的CORS的理解(一previous answer是一个非常良好的阅读)是
否“访问控制允许来源”标头出现在请求 资源
意味着它不存在于响应标题中,这意味着Google不希望我通过浏览器从JS访问其资源(指向其他https://accounts.google.com
)。
这可能是一个好主意,但我控制所有的元素,从代码到浏览器并想获得该令牌以同样的方式,我得到它在非浏览器环境,特别是我的工作Python代码。
如何告知https://accounts.google.com
发送回Access-Control-Allow-Origin
标题,告诉我的浏览器可以接受呼叫?
你不能。
客户端和服务器端的代码需要以不同的方式使用OAuth交互。
谷歌provide documentation explaining the client side process。
重要的是,它的一部分涉及重定向到谷歌的服务器,而不是通过fetch
或XMLHttpRequest
访问它们。
@昆汀的回答“你不能”是我的问题是正确的(“我怎么能强制服务器发回正确的头”)。
这是谷歌决定不提供这个头,有效地切断任何非交互式应用程序。
作为一个解决方案,我会看
- 如何强制浏览器不考虑通过CORS提供的安全机制(似乎是通过扩展或命令行参数某些方面,我将更新这个答案,一旦我找到它)
- 或编写一个中间层,将为我查询数据并逐字传递给应用程序(在我的情况下,这是相当于只是从JS进行查询 - 但它增加了一层额外的代码和服务器)
查看ht tps://stackoverflow.com/questions/43276462/cors-issue-while-requesting-access-token-google-oauth-2/43276710#43276710 – sideshowbarker
@sideshowbarker:*“OAuth2身份验证端点不支持AJAX的设计” * - 我不明白这一点。从服务器角度来看,AJAX只是一个HTTP调用。它支持非交互式身份验证(以及对给定范围的相关授权) - 在我提到的问题中的服务器代码中,这可以正常工作。 – WoJ