Вызов функции в модуле с авторизацией пользователя через Execution API

Мы ищем способ вызвать функцию в надстройке в контексте пользователя (авторизация) из нашего веб-приложения. Мы попытались использовать Apps Script Execution API, чтобы вызвать это. Надстройка потока (скрипт приложения) регистрирует токен доступа в нашем веб-приложении, и веб-приложение запускает API выполнения, используя токен доступа. Это работает впервые. Но проблема в том, что токен доступа действителен всего несколько минут. После чего веб-приложение не может инициировать функцию через API выполнения из-за сбоя авторизации.

Вопросы:

Является ли наш подход к запуску функции сценария надстройки/приложения из другого веб-приложения в контексте пользователя правильным с помощью API выполнения?

Если да, то как избежать истечения срока действия токена доступа? По-видимому, в скрипте приложений нет API для «получения токена обновления» / «обновления токена». Как мы можем обновить токен, чтобы он был действителен вечно (пока пользователь не отменит его)?

Есть ли какой-то кардинально другой подход, который поможет в этом случае?

Я вижу, что надстройки, такие как «PearDeck», «Утверждение форм», «Издатель форм» и т. д., успешно делают это (запуская функцию надстройки из веб-приложения с авторизацией пользователя).

Надеюсь получить совет специалиста на этом форуме. Спасибо

Используемый Execution API - с проблемой истечения срока действия токена

function prepareToken() {
// send to web app
    var token = ScriptApp.getOAuthToken();

    URLFetchApp.fetch("url?token="+token);
}

function doSomeWorkFromUserContext() {
    // impl here
}

POST https://script.googleapis.com/v1/scripts/{scriptId}:run

Request Header
Authorization: Bearer + {token}

Request Body 
{
  "function": "doSomeWorkFromUserContext"
}

Функция doSomeWorkFromUserContext должна вызываться все время вызова, но через некоторое время получать ошибку авторизации.


person Michaes    schedule 27.08.2019    source источник
comment
Авторизовать свое веб-приложение отдельно, используя другой проект?   -  person TheMaster    schedule 27.08.2019


Ответы (1)


Когда пользователь впервые авторизует ваше приложение, вы получаете токен обновления вместе с токеном доступа. Срок действия токена доступа обычно истекает через час, и вы должны использовать токен обновления, чтобы получить новый токен доступа.

Обратите внимание, что токен обновления возвращается только тогда, когда пользователь изначально авторизует ваше приложение.

Вам потребуется отозвать авторизацию пользователя (см. ниже) и попросить его повторно авторизовать приложение, чтобы получить токен обновления. Отзыв доступа может быть достигнут одним из 3 способов:

Библиотека GAS OAuth2 Эрика Коледы отлично справляется с управлением всем потоком OAuth2 (включая автоматический обновление токенов доступа), поэтому обязательно проверьте это.

person TheAddonDepot    schedule 27.08.2019
comment
Спасибо за Ваш ответ. Однако нам нужно обновить доступ (а не отозвать доступ). И сценарий приложения не использует явно OAuth2, а неявно получает токен доступа из сценария предварительно авторизованного приложения, используя ScriptApp.getOAuthToken(). Таким образом, нет доступного токена обновления для обновления токена доступа. - person Michaes; 28.08.2019
comment
ScriptApp.getOAuthToken() автоматически обновляет токен через час. Поэтому просто вызовите эту функцию еще раз, чтобы получить новую. - person TheAddonDepot; 28.08.2019
comment
Dimu Designs в сценарии приложений ScriptApp.getOAuthToken() дает обновленный токен. Но мы храним токен в веб-приложении и вызываем API-интерфейс выполнения сценариев приложений для запуска некоторой функции в пользовательском контексте/авторизации. Даже если мы пытаемся получить новый токен из веб-приложения, вызывая Apps Script через Execution API каждые несколько минут, через некоторое время токен становится недействительным, и мы не можем вызывать Apps Script Execution API из веб-приложения. - person Michaes; 28.08.2019
comment
Итак, в основном нам нужен способ обновить/обновить токен аутентификации из-за пределов скрипта приложения, чтобы мы могли вызывать API выполнения скрипта приложений. - person Michaes; 28.08.2019
comment
Хранение токена, предоставленного ScriptApp.getAuthToken, не лучший способ сделать это. При использовании Execution API вы обычно создаете клиентское приложение через Google Cloud Console, где вам выдается идентификатор клиента и секрет клиента. Затем вы используете эти учетные данные в потоке OAuth, чтобы получить доступ и токены обновления. - person TheAddonDepot; 28.08.2019
comment
См. документацию. - person TheAddonDepot; 28.08.2019
comment
Сценарий, в котором нам нужен «рабочий процесс утверждения», например решение. Когда утверждающий (не обязательно пользователь Gmail/GSuite) нажимает кнопку «Одобрить» в полученном им электронном письме, мы хотим запустить функцию сценария приложений в контексте пользователя, настроившего рабочий процесс (не в контекст утверждающего, у которого может даже не быть учетной записи Google), чтобы выполнить какой-либо процесс, например создать документ Google и отправить его человеку, отправившему форму. Я уверен, что это можно сделать с помощью Execution API (как в некоторых надстройках). Недостающий момент заключается в том, как сохранить токен доступа, действительный для вызова API. Любой указатель в этой строке приветствуется - person Michaes; 31.08.2019
comment
Вы не можете обновить токены доступа, которыми управляет проект GAS, поэтому вам необходимо создать веб-приложение (через консоль Google Cloud) и использовать предоставленные учетные данные (идентификатор клиента и секрет клиента<). /b>), чтобы создать пользовательский поток OAuth для создания токенов обновления и доступа по мере необходимости. Все это описано в документации, ссылку на которую я дал в мой предыдущий комментарий. - person TheAddonDepot; 31.08.2019
comment
Мне известен маршрут учетных данных для получения токена обновления, но это дает токен того, кто входит в веб-приложение. Мне нужен маркер того, кто установил надстройку (скрипт приложения), чтобы функция скрипта приложения была триггером в его/ее контексте. Например, если скрипт отправляет электронное письмо, оно должно исходить от пользователя надстройки, а не от пользователя веб-приложения. (пользователю веб-приложения вообще не нужно иметь учетную запись Google) - person Michaes; 31.08.2019
comment
Надстройки, такие как Pear Deck, Form Approvals и Form Publisher, делают это. Я хочу знать, чтобы они сделали это. - person Michaes; 31.08.2019