API Google Диска, не удается открыть стандартный диалог обмена через JS (ошибка x-frame-options)

У меня есть приложение JavaScript, которое использует API Google Диска. Я прочитал, как открыть стандартный диалог обмена здесь: 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 и на других сайтах есть похожие вопросы, но они не помогают. Я предполагаю, что Google не позволяет себе быть в кадре на сайте, отличном от Google (причина «SAMEORIGIN»).

Что я могу сделать, чтобы открыть диалоговое окно обмена в моем приложении?


person imkost    schedule 12.03.2014    source источник
comment
Было бы полезно, если бы вы включили код, который вы используете, чтобы попытаться открыть стандартное диалоговое окно общего доступа.   -  person Ben Smith    schedule 14.03.2014
comment
@Fresh, включил код   -  person imkost    schedule 15.03.2014


Ответы (2)


На странице «Запуск диалогового окна общего доступа к Google Диску в вашем приложении» здесь указано:

URL-адрес страницы, которая запускает диалоговое окно, должен иметь то же происхождение, что и открытый URL-адрес, зарегистрированный для приложения.

Если вы затем посмотрите инструкции по настройке Drive SDK здесь , вы можете видеть, что раздел «Открыть URL» гласит:

Есть две важные вещи, которые следует учитывать при открытии URL:

  • Убедитесь, что вы указали полное доменное имя для Open URL — localhost не будет работать.
  • URL-адрес должен принадлежать вам. После завершения регистрации приложения вам потребуется подтвердить право собственности на этот URL-адрес, чтобы создать страницу в Интернет-магазине Chrome. Дополнительные сведения см. в разделе Проверка сайта.

Следовательно, ваша страница, которая запускает диалоговое окно, не имеет то же происхождение, что и открытый URL-адрес, зарегистрированный для приложения в настройках SDK Google Диска. Поэтому, чтобы решить вашу проблему, исправьте URL-адрес открытия, чтобы он имел правильный URL-адрес, то есть URL-адрес того же происхождения, что и URL-адрес открытия. Обратите внимание, что вы можете изменить настройки SDK Google Диска через https://console.developers.google.com/project< /а>.

А также убедитесь, что URL-адрес открытия установлен правильно. Вам также потребуется заменить идентификатор приложения Drive SDK на «MY_APP_ID». Вы можете найти идентификатор приложения, следуя этим инструкциям:

  1. Перейдите к https://console.developers.google.com.
  2. Нажмите на свой проект
  3. Нажмите «API и авторизация» слева.
  4. Щелкните значок шестеренки настроек Drive SDK.
  5. Затем «Идентификатор приложения» можно найти под заголовком «Google Диск SDK», например. Идентификатор приложения: 47XXXXXXXX3
person Ben Smith    schedule 17.03.2014
comment
Я не знал о проверке сайта, спасибо. Но даже после проверки возникает та же ошибка. Открытый URL установлен правильно. Проверил это 4 раза, пытался добавить и удалить косую черту. Ничего. С gapi все работает нормально, кроме стандартного диалога обмена. - person imkost; 17.03.2014
comment
Также вы знаете, что вам нужно заменить ‹MY_APP_ID› на идентификатор вашего приложения Drive SDK? - person Ben Smith; 18.03.2014

Проблема была решена благодаря этому ответу https://stackoverflow.com/a/20742994/1185123

dan-man говорит в своем ответе:

Идентификатор клиента. Его можно найти в Google Cloud Console — см. выше. У меня 12-значное число, возможно, у вас тоже будет.

Идентификатор моего клиента выглядит так

175564412906-ui22fsaghkvkkj09j2bprku55m8k3d0d.apps.googleusercontent.com

Я использовал этот идентификатор в

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

Прочитав ответ, я попытался использовать только первые 12 цифр моего идентификатора клиента. Я не ожидал, что это сработает, я просто был в отчаянии. Но что странно, работает отлично!

Если кто-то может объяснить, почему это работает и почему об этом ничего не сказано в документации — милости просим!

person imkost    schedule 18.03.2014
comment
Я обновил свой ответ, чтобы подробно указать, где именно можно найти идентификатор приложения в консоли разработчиков. Я согласен, что сбивает с толку то, что в примере явно не указано, где это найти. Я думаю, что авторы документации ожидают, что пользователи будут знать эту информацию к тому времени, когда они доберутся до этого примера! - person Ben Smith; 18.03.2014
comment
Спасибо за объяснение! Никогда не видел App ID под заголовком. - person imkost; 18.03.2014
comment
Рад, что смог помочь. Я согласен, что документация Google хороша, но недостаточно подробна! - person Ben Smith; 18.03.2014