2017-10-18 184 views
1

我使用服务帐户访问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标题,告诉我的浏览器可以接受呼叫?

+0

查看ht tps://stackoverflow.com/questions/43276462/cors-issue-while-requesting-access-token-google-oauth-2/43276710#43276710 – sideshowbarker

+0

@sideshowbarker:*“OAuth2身份验证端点不支持AJAX的设计” * - 我不明白这一点。从服务器角度来看,AJAX只是一个HTTP调用。它支持非交互式身份验证(以及对给定范围的相关授权) - 在我提到的问题中的服务器代码中,这可以正常工作。 – WoJ

回答

2

你不能。

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

谷歌provide documentation explaining the client side process

重要的是,它的一部分涉及重定向到谷歌的服务器,而不是通过fetchXMLHttpRequest访问它们。

+0

我不明白的是,我可以从python进行一个需要用户授权的调用(通过复制粘贴一个链接作为响应)**或者**创建一个不需要交互授权的服务帐户类型的调用(它被提供给上游的服务帐户)。为什么不在JS中?上下文是相同的(无人访问数据)和请求帐户的相同权限。 – WoJ

+0

我读了你提供的链接,它与Python版本的文档很相似(其中明确的用户授权也可能是一个选项) – WoJ

+0

此外,安全性的影响是没有的 - 我最终会写一个python层,它会请求服务帐户的风格,数据并逐字提供给我的JS代码。这可能直接发生在JS中(我不是在抱怨,只是试图理解基本原理) – WoJ

0

@昆汀的回答“你不能”是我的问题是正确的(“我怎么能强制服务器发回正确的头”)。

这是谷歌决定不提供这个头,有效地切断任何非交互式应用程序。

作为一个解决方案,我会看

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