Google Drive API无法通过JS打开标准共享对话框(x-frame-options错误)

时间:2014-03-12 06:53:37

标签: javascript google-drive-api same-origin-policy x-frame-options

我有一个使用Google Drive API的JavaScript应用。我在这里阅读了如何打开标准共享对话框:https://developers.google.com/drive/web/manage-sharing

<head>
...
<script type="text/javascript" src="https://apis.google.com/js/api.js"></script>
<script type="text/javascript">
    init = function() {
        s = new gapi.drive.share.ShareClient('<MY_APP_ID>');
        s.setItemIds(["<MY_FILE_ID>"]);
    }
    window.onload = function() {
        gapi.load('drive-share', init);
    }
</script>
</head>
<body>
    <button onclick="s.showSettingsDialog()">Share</button>
</body>

似乎我做的一切正确,当我点击我的share按钮时,对话框开始加载但无法加载。

在控制台中我看到:

Refused to display 'https://drive.google.com/share?...' in a frame
because it set 'X-Frame-Options' to 'SAMEORIGIN'.

我已经搜索了这个错误,我已经看到在SO和其他网站上有一些类似的问题,但它们没有帮助。我猜谷歌不允许自己在非谷歌网站的框架中(“SAMEORIGIN”的原因)。

如何在我的应用中打开共享对话框?

2 个答案:

答案 0 :(得分:4)

&#34;在您的应用中启动Google云端硬盘共享对话框&#34;第here页:

  

启动对话框的网页的网址必须具有相同的来源   作为为应用注册的开放URL。

然后,如果您查看指示&#34;配置Drive SDK&#34; here,您可以看到&#34;打开网址&#34;部分内容如下:

  

开放网址需要记住两件重要的事情:

     
      
  • 确保为Open URL提供完全合格的域名 - localhost无法正常工作。
  •   
  • 网址必须属于您。应用注册完成后,您需要验证您对此网址的所有权才能创建   Chrome网上应用店列表。有关详细信息,请参阅网站验证。
  •   

因此,启动对话框的页面 与您在Google Drive SDK设置中为应用注册的Open URL具有相同的来源。因此,要解决您的问题,请更正打开的URL,使其具有正确的URL,即与Open URL具有相同来源的URL。请注意,您可以通过https://console.developers.google.com/project更改Google云端硬盘SDK设置。

同时确保正确设置Open URL。您还需要将Drive SDK应用ID替换为“MY_APP_ID&#39;”。您可以按照以下说明找到应用ID:

  1. 转到https://console.developers.google.com
  2. 点击您的项目
  3. 点击&#34; API和auth&#34;在左边
  4. 点击&#34;云端硬盘SDK&#34;设置cog图标
  5. &#34; App ID&#34;然后可以在&#34; Google Drive SDK&#34;标题例如应用ID:47XXXXXXXX3

答案 1 :(得分:1)

由于这个答案https://stackoverflow.com/a/20742994/1185123

,问题解决了

dan-man 在他的回答中说:

  

客户端ID 您可以在Google Cloud Console中找到它 - 请参阅上文。   我的数字是12位数,所以你的数字可能也是。

我的客户端ID看起来像

  

175564412906-ui22fsaghkvkkj09j2bprku55m8k3d0d.apps.googleusercontent.com

我在

中使用了此ID
s = new gapi.drive.share.ShareClient('<MY_APP_ID>');

在阅读答案后,我尝试仅使用我的客户端ID的前12位数字。我没想到它会起作用,我只是绝望。但奇怪的是,它完美无缺!

如果有人可以解释为什么它有效,为什么文档中没有说明这一点 - 欢迎您回答!