对 Google 协作平台提要/API 的 CORS 身份验证请求被阻止

Posted

技术标签:

【中文标题】对 Google 协作平台提要/API 的 CORS 身份验证请求被阻止【英文标题】:CORS authenticated requests to Google Sites feed/API blocked 【发布时间】:2016-08-18 19:53:04 【问题描述】:

我目前正在构建一个 ASP.NET Web 应用程序,以简化 Google 站点、页面、Google 站点上的小工具和 Google 站点的 ACL 的配置。

我遇到了许多开发人员已经遇到的问题:跨域资源。根据关于对 Google API 的 CORS 请求的 Google 文档,您只需使用 XMLHttpRequest(或 AJAX)请求,在标头中提供您的访问令牌。更多信息可以在这里找到:

https://developers.google.com/api-client-library/javascript/features/cors

当我在 Google Sites 上的域内访问 Google Sites API 时,我已经完全能够完成此操作,当我的浏览器窗口的位置在域内时注入 AJAX 请求。从我的域中创建新站点的成功请求示例:

$.ajax(

    ////// REQUEST \\\\\\
    type: "POST",
    url: "https://sites.google.com/feeds/site/[domainName]",
    contentType: "application/atom+xml",
    headers: 
        "Authorization": "Bearer " + [accessToken],
        "GData-Version": "1.4"
    ,
    data: ["<entry xmlns='http://www.w3.org/2005/Atom' xmlns:sites='http://schemas.google.com/sites/2008'>",
               "<title>What a site</title>",
               "<summary>Best description ever.</summary>",
               "<sites:theme>ski</sites:theme>",
           "</entry>"].join(""),

    ////// LOGGING \\\\\\
    beforeSend: function () 
        console.log('-------Making-the-request-------');
    ,
    success: function (result) 
        console.log(result);
    ,
    error: function (xhr, ajaxOptions, thrownError) 
        console.log(thrownError);
        console.log(xhr.status);
    
);

(在以下几种情况下,我将 https:// 写为 [https],因为我的帐户仍被限制为帖子中的 2 个链接)。

此时一切进展顺利,我认为我已将所有内容都设置为将代码用于我的 ASP.NET 站点。唉,事情并不总是按计划进行。当我在我的应用程序中执行完全相同的 AJAX 调用时(现在仍然托管在 [https]localhost:44301 上),我收到以下错误:

XMLHttpRequest 无法加载 [https]sites.google.com/feeds/site/[censored] 对预检的回应 请求未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用 Origin '[https]localhost:44301' 使用权。响应的 HTTP 状态代码为 405。

常见的 CORS 错误。不过我很惊讶,因为向 Google API 发出请求的建议方式就是这样。我还发现了一篇关于在 Google Cloud API 中使用 CORS 的文章:

https://cloud.google.com/storage/docs/cross-origin

在文章中写道:

大多数客户端(例如浏览器)使用 XMLHttpRequest 对象来创建 跨域请求。 XMLHttpRequest 负责所有的工作 插入正确的标头并处理与 服务器。这意味着您无需添加任何新代码来利用 CORS 支持,它可以像谷歌云存储一样正常工作 为 CORS 配置的存储桶。

当然,这不是 Google Sites API,但我很难相信 Google 没有在其所有 API 中实现相同的功能。

有谁知道是否有可能在独立的 ASP.NET 应用程序中实现诸如此类的成功请求?如果有,怎么做?

非常感谢您花时间阅读我的艰辛。

更新:

我已就我的问题联系了 Google Apps 支持,并得到了以下回复:

除了您提供的信息,我还查看了您的帖子 在 CORS authenticated requests to Google Sites feed/API blocked。 注释在 https://developers.google.com/google-apps/sites/docs/1.0/developers_guide_java#SiteFeedPOST 仅强化了“我可以创建新的 Google 网站吗?”下的声明。 和“我如何复制网站?”在 https://developers.google.com/google-apps/sites/faq#Getting__Started, 其中指出“Google Apps 用户可以使用站点供稿来……”但是, 如果您已授权,我不明白为什么这与您的问题有关 针对您的域管理员帐户,因为注释仅 表示 gmail.com 用户将无法使用列出的 创建或复制网站的方法。

我没用过CORS,所以不能评论它的操作,但是一直 能够使用 HTTP GET 和 POST 成功列出和创建站点 通过原始 HTTP 客户端发出请求,因此 API 正常运行 关于跨域请求。我使用了示例 XML 文档 在 https://developers.google.com/google-apps/sites/docs/1.0/developers_guide_protocol#SitesFeedPOST 创建我的站点,为客户端配置我的凭据 开发者控制台项目。请求仅失败的事实 您的 ASP.NET 站点暗示该环境中有某些东西 配置不正确。不幸的是,那不在我的范围内 支持范围,所以我无法提供任何具体建议,其他 而不是检查相关文件,或在 Stack Overflow 的 ASP.NET 部分,位于 https://***.com/questions/tagged/asp.net.

【问题讨论】:

你可以使用 JSONP 做到这一点 【参考方案1】:

您可以在删除"GData-Version": "1.4" 后重试吗? 如果您确实要发送此值,请通过添加查询参数(例如v=X.0)发送。来自here的资源

更新:

“注意:此功能仅适用于 Google Apps 域。” From guides

【讨论】:

感谢您提出建议!我现在尝试删除 GData-Version,结果相同。然后我继续按照建议添加查询参数,再次显示相同的错误消息。 额外:我添加了 GData-Version: 1.4 因为对谷歌站点 API 的每个请求都应该指定它:developers.google.com/google-apps/sites/docs/1.0/… 您能提供您的网络日志吗?请求和响应? (当然要隐藏您的帐户详细信息) 我现在已经做了很多调整。我已将 Google 协作平台域以及我的 ASP.NET 应用程序移至我的实习公司的域,以试图消除该问题。不过,现在我的请求刚刚被取消,所以我几乎退了一步。即使是对令牌的请求现在也失败了。 prntscr.com/ay74m2【参考方案2】:

已解决

似乎很多浏览器仍然会阻止跨不同域的 AJAX 请求,即使您尝试访问的 API 允许它也是如此。我现在不使用 AJAX,而是在 DLL 中使用 C# WebRequest

例子:

// Create the request
WebRequest request = WebRequest.Create("https://sites.google.com/feeds/site/[domainName]");
request.Method = "POST";
request.contentType = "application/atom+xml";
request.Headers.Set(HttpRequestHeader.Authorization, "Bearer " + [accessToken]);
request.Headers["GData-Version"] = "1.4";

// Fill in the data and encode for the datastream
string data = ["<entry xmlns='http://www.w3.org/2005/Atom' xmlns:sites='http://schemas.google.com/sites/2008'>",
                   "<title>What a site</title>",
                   "<summary>Best description ever.</summary>",
                   "<sites:theme>ski</sites:theme>",
               "</entry>"].join("");
byte[] byteArray = Encoding.UTF8.GetBytes (data);

// Add the data to the request
Stream dataStream = request.GetRequestStream ();
dataStream.Write (byteArray, 0, byteArray.Length);
dataStream.Close ();

// Make the request and get the response
WebResponse response = request.GetResponse ();

更多信息可以在 MSDN 上找到: https://msdn.microsoft.com/en-us/library/debx8sh9(v=vs.110).aspx

【讨论】:

以上是关于对 Google 协作平台提要/API 的 CORS 身份验证请求被阻止的主要内容,如果未能解决你的问题,请参考以下文章

Google协作平台

Google 协作平台 HTML 框 - 剥离 Javascript

xml 适用于Google协作平台的Twitter Feed模块

使用“返回”按钮时,Google 协作平台小工具在 Chrome 上消失

Eolink征文活动中心 — 一站式API协作平台

无法在Google协作平台上传本地文件