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

时间:2016-04-25 12:16:22

标签: asp.net ajax google-api xmlhttprequest cors

我目前正在构建一个ASP.NET网络应用程序,以简化Google协作平台,网页,Google协作平台上的小工具和Google协作平台的配置。

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

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

当我在Google协作平台上访问Google协作平台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);
    }
});

(在下面的几个案例中,由于我的帐户仍被限制为帖子中的2个链接,因此我将https://写为[https]。)

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

  

XMLHttpRequest无法加载   [https] sites.google.com/feeds/site/ [censored]对预检的回应   请求未通过访问控制检查:否   &#39;访问控制允许来源&#39;标题出现在请求的上   资源。 Origin&#39; [https] localhost:44301&#39;因此是不允许的   访问。响应的HTTP状态代码为405。

通常的CORS错误。我很惊讶,因为向Google API提出请求的建议方式就是这样。我还发现了一篇关于将CORS与Google Cloud API结合使用的文章:

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

在文章中指出:

  

大多数客户端(例如浏览器)使用XMLHttpRequest对象进行制作   跨域请求。 XMLHttpRequest负责所有的工作   插入正确的标题并处理与CORS的交互   服务器。这意味着您不能添加任何新代码以利用   CORS支持,它将按预期用于Google云存储   为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网站”下的声明吗?&#39;   和&#39;如何复制网站?&#39;在   https://developers.google.com/google-apps/sites/faq#Getting__Started,   表明Google Apps用户可以使用网站Feed来实现...&#39;然而,   如果您已获得授权,我不明白为什么这与您的问题相关   针对您的域管理员帐户,仅作为备注   表明gmail.com用户无法使用列出的内容   创建或复制网站的方法。

     

我还没有使用CORS,因此无法评论它的操作,但已经过   能够使用HTTP GET和POST成功列出和创建站点   通过原始HTTP客户端请求,因此API正在按预期运行   关于跨域请求。我使用了示例XML文档   在   https://developers.google.com/google-apps/sites/docs/1.0/developers_guide_protocol#SitesFeedPOST   创建我的网站,使用我的凭据配置客户端   Developer Console项目。请求仅失败的事实   您的ASP.NET站点意味着该环境中存在某些内容   没有正确配置。不幸的是,这不在我的身边   支持范围,所以我无法提供任何具体的建议,其他   而不是检查相关文件,或在。中发布请求   Stack Overflow的ASP.NET部分   https://stackoverflow.com/questions/tagged/asp.net

2 个答案:

答案 0 :(得分:0)

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

<强>更新:

&#34;注意:此功能仅适用于Google Apps域。&#34; From guides

答案 1 :(得分:0)

<强>解决

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

示例:

// 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