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

问题描述:

我有一个使用Google Drive API的JavaScript应用程序。我读到这里怎么打开一个标准的共享对话框:https://developers.google.com/drive/web/manage-sharingGoogle Drive API,无法通过JS打开标准共享对话框(x-frame-options error)

<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'. 

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

我该怎么做才能在我的应用程序中打开共享对话框?

+0

如果您包含您用于尝试打开标准共享对话框的代码,它将有所帮助。 –

+1

@新鲜,包括代码 – imkost

“发射的谷歌驱动器在您的应用程序共享对话框”在页面here状态:

一个启动对话必须具有相同的起源 作为应用程序注册打开URL的网页的URL。

如果你再看看说明“配置驱动器SDK” here,你可以看到“打开URL”部分读取:

有要记住两个重要的事情打开网址:

  • 请确保您为Open URL提供完全限定的域名 - localhost不起作用。
  • 该URL必须属于您。应用注册完成后,您需要验证您对此网址的所有权,才能创建一个 Chrome网上应用店列表。有关更多信息,请参阅网站验证。

因此您的网页,其中推出的对话框不具有相同起源于你谷歌硬碟SDK设置应用程序注册的打开URL。因此,要解决您的问题,请更正打开网址,以便它具有正确的网址,即具有与打开网址相同来源的网址。请注意,您可以通过https://console.developers.google.com/project更改Google Drive SDK设置。

以及确保打开网址设置正确。您还需要将您的云端硬盘SDK应用ID替换为“MY_APP_ID”。您可以按照以下说明找到应用ID:

  1. 转到https://console.developers.google.com
  2. 点击你的项目
  3. 点击“API和身份验证”左侧
  4. 单击“驱动器SDK”的设置齿轮图标
  5. 然后可以在“Google Drive SDK”标题下找到“App ID”,例如应用程序ID:47XXXXXXXX3
+0

我不知道网站验证,谢谢。但即使经过验证,也会出现相同的错误。打开网址设置正确。检查了这4次,试图添加并删除斜线。没有。除了标准共享对话框之外,gapi的一切工作都很好 – imkost

+0

另外你也知道你需要用你的Drive SDK应用ID替换“”? –

问题解决了感谢这个答案https://stackoverflow.com/a/20742994/1185123

丹人说,在他的回答:

客户端ID您可以在谷歌找到这云端控制台 - 参见上文。 Mine是一个12位数的数字,所以你的可能也是。

矿客户端ID看起来像

175564412906-ui22fsaghkvkkj09j2bprku55m8k3d0d.apps.googleusercontent.com

我在

s = new gapi.drive.share.ShareClient('<MY_APP_ID>'); 

用这个ID读答案后,我试图只使用我的客户端ID的前12位数字。我没有想到它会起作用,我只是绝望。但奇怪的是,它非常完美!

如果有人能解释它为什么起作用,为什么在文档中没有说到这一点 - 欢迎您回答!

+0

我已经更新了我的答案,详细说明了在开发者控制台中可以找到APP ID的位置。我同意这个例子没有明确说明在哪里可以找到它,这是令人困惑的。我认为文档的编写者希望用户在得到这个例子的时候知道这些信息! –

+1

谢谢你的解释!从未在标题下看过App ID。 – imkost

+0

很高兴我能帮到你。我同意Google文档很好,但不够详细! –