Я пытался (без особого успеха) запустить облачную функцию 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 проблемы, какие-либо данные о том, как сделать этот процесс возможным?