对 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 协作平台 HTML 框 - 剥离 Javascript
xml 适用于Google协作平台的Twitter Feed模块