Запуск облачной функции из таблиц Google (через скрипт приложений Google) - PullRequest
0 голосов
/ 26 мая 2020

Я пытался (без особого успеха) запустить облачную функцию Google с помощью HTTP-запроса из таблицы Google (скрипт приложений Google), и это, похоже, не сработало. Несколько важных моментов:

  • Функция должна выполняться только в том случае, если пользователь из моей организации
  • Пользователя не нужно приглашать в проект GCP

Я знаю, что это очень легко сделать в Google Colabs и Python. Следующий скрипт позволит пользователю в моей организации, который не в проекте GCP запускать облачную функцию:

import requests
import google.auth
from google.auth.transport.requests import Request
from google.colab import auth


credentials, project_id = google.auth.default()
request = Request()
credentials.refresh(request=request)

GCF_URL = ''https://project_location-project_id.cloudfunctions.net/name-of-your-funciton'' 
resp = requests.get(GCF_URL, headers={'Authorization': f'Bearer {credentials.id_token}'})

Это сработает и запустит облачную функцию для всех пользователей внутри моего организации, но не работает, например, для моей личной электронной почты.

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

Я пробовал кое-что, что видел в Интернете, например, этот пример:

function callExternalUrl() {

    var url = 'https://project_location-project_id.cloudfunctions.net/name-of-your-funciton';

    var oauthToken = ScriptApp.getOAuthToken(); // get the user who's logged into Google Sheet's OAuth token

    const data = {
        oauthToken, // 1. add the oauth token to the payload
        activeUser: param.user // 2. this here is important as it adds the userinfo.email scope to the token
        // any other data you need to send to the Cloud Function can be added here
    };

    var options = {
        'method' : 'get', // or post, depending on how you set up your Cloud Function
        'contentType': 'application/json',
        // Convert the JavaScript object to a JSON string.
        'payload' : JSON.stringify(data)
      };

    const response =  UrlFetchApp.fetch(url, options); 

    Logger.log('Response Code: ' + response.getResponseCode());

}

Это дает ошибку 403, но если я изменю ее так, чтобы он дает OAuth в правильном формате, например:

function callExternalUrl() {

    var url = 'https://project_location-project_id.cloudfunctions.net/name-of-your-funciton';

    var oauthToken = ScriptApp.getOAuthToken(); // get the user who's logged into Google Sheet's OAuth token


    var response = UrlFetchApp.fetch(url, {
    headers: {
      Authorization: 'Bearer ' + oauthToken
    }
  });
    // const response =  UrlFetchApp.fetch(url, options); 

    Logger.log('Response Code: ' + response.getResponseCode());

}

Я получаю 401 (т.е. авторизация не удалась). Теперь кажется, что мне просто нужно получить правильную аутентификацию от пользователей, чтобы отправить этот запрос, чтобы он заработал. Я видел это репозиторий github, который фокусируется на получении OAuth2 из скриптов приложений Google (https://github.com/gsuitedevs/apps-script-oauth2), но я тоже не могу заставить его работать, его нужно было бы адаптировать для облака в некоторых способ, о котором я не знаю.

Я прочитал

Безопасный вызов функции Google Cloud с помощью скрипта Google Apps

, что очень похоже, но похоже, не дошло до root проблемы, какие-либо данные о том, как сделать этот процесс возможным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...