Вызов скрипта Google Apps, требующего авторизации в AJAX

#javascript #ajax #google-apps-script #oauth-2.0 #google-oauth

#javascript #ajax #google-apps-script #oauth-2.0 #google-oauth

Вопрос:

Мне нужно получить доступ к скрипту Google Apps в AJAX, которому требуется авторизация от пользователя для отправки электронной почты из его учетной записи GMail. По разным причинам я должен отправить это электронное письмо из скрипта Google Apps.

Вызов выполняется из моего веб-приложения, размещенного на моем сервере. Я также использую Google Signin аутентификацию. Я попытался включить gmail в области авторизации My web app, но этого недостаточно, потому что мое веб-приложение и мой скрипт Google Apps не являются одним и тем же объектом для Google (не тот же client_id).

Я бы хотел, чтобы все это работало следующим образом :

  1. Пользователь проходит аутентификацию в моем веб-приложении в своей учетной записи Google
  2. Он нажимает на кнопку, чтобы отправить электронное письмо
  3. Если он никогда не давал авторизацию моему скрипту Google Apps, отображается всплывающее окно авторизации
  4. Он предоставляет разрешения, он не перенаправляется на страницу результатов скрипта Google Apps, но остается в моем веб-приложении
  5. Скрипт Google Apps отправляет электронное письмо и возвращает что-то в JSONP в мое веб-приложение.

Возможно ли это сделать?

Я подумал о нескольких решениях, но я не знаю, как заставить их работать :

  1. Есть ли способ установить client_id скрипта Google Apps таким же, как у моего веб-приложения?
  2. Или есть способ создать (и настроить) кнопку, которая автоматически генерируется, когда я пытаюсь получить доступ к скрипту Google Apps, к которому я не предоставил доступ, и отобразить эту кнопку в моем веб-приложении?

Я застрял в этом, любая помощь очень ценится!

Ответ №1:

Ни один из ваших вариантов невозможен. Вы не можете обойти этот экран авторизации каким-либо образом.
Использование того же идентификатора клиента или областей не поможет вам, максимум, что позволит авторизовать вашу учетную запись, а не учетную запись пользователя. Каждый пользователь является независимым потоком oauth со своим собственным токеном, сохраняемым apps script.
Однако
, если вам необходимо, теперь это можно сделать по-другому, потому что:
1) apps script теперь поддерживает (с февраля 2014) реализацию вашего собственного потока oauth2.
Смотрите StateTokenBuilder/ScriptApp.getOAuthToken()/ScriptApp.newStateToken()

2) Google now предлагает oauth2 gmail api (представлен несколько дней назад на Google I / O 2014)

с помощью этих двух вы можете создать свой собственный код для отправки электронных писем, используя свой собственный консольный проект и т.д.

Комментарии:

1. Хорошо, спасибо за ваш ответ. Не могу ли я настроить всплывающее окно, генерируемое скриптом Google Apps, как для моего веб-приложения? Я заметил в HTML-коде, что GAS связал client_id с моим скриптом. Однако в консоли разработчиков для моего скрипта не создан идентификатор клиента. В частности, я хотел бы изменить redirect_uri на «postmessage», чтобы всплывающее окно закрывалось после предоставления пользователем доступа, но я получаю no_registered_origin, если я это сделаю.

2. нет, в настоящее время нет способа получить доступ к этой консоли, ее скрытый

3. обновленный ответ, описывающий альтернативный способ сделать это.

4. Итак, я думал, что доступ, который я предоставил GAS с помощью client_id, который я создал вручную, вообще не учитывался, но, когда я перехожу на страницу сценария непосредственно на новой вкладке, приглашение не запрашивает у меня доступ к профилю и gmail, только для «автономного доступа». Это означает, что он почти работает, если я могу заставить пользователя предоставить этот доступ в моем веб-приложении. Однако, независимо от того, изменяю ли я access_type на online или offline , результат тот же. Вы знали об этом? Это нормальное поведение?

5. Круто, я не знал, что можно добраться до консольного проекта. Тем не менее, с помощью ajax это невозможно сделать, вам нужно предоставить ссылку для пользователя, чтобы щелкнуть и выполнить поток oauth в первый раз. Ajax не может этого сделать