Эта проблема
У нас (у меня и коллеги) есть код, который хорошо подходит для случая использования веб-приложения, за исключением аутентификации пользователей за пределами нашего домена. Если бы не эта проблема, мы бы хотели использовать следующую конфигурацию (на верхнем уровне в нашем файле манифеста).
"webapp": {
"access": "ANYONE",
"executeAs": "USER_DEPLOYING"}
Для пользователей внутри нашего домена мы можем использовать Session.getActiveUser(). а>. Затем мы можем сравнить это с нашей базой данных и показать конфиденциальные данные, которые должны быть видны только этой учетной записи.
Однако для пользователей за пределами нашего домена Session.getActiveUser()
дает пустую строку ''
, поэтому мы не можем использовать ее для запроса информации в нашей базе данных, поэтому нам нужно что-то другое. Мы пришли к следующей настройке.
Альтернативная установка
Мы развертываем веб-приложение с помощью "executeAs": "USER_ACCESSING"
и "oauthScopes": ["https://www.googleapis.com/auth/userinfo.email"]
. Разворачиваем другой скрипт как исполняемый файл API (и следуем инструкциям здесь), с привилегированной учетной записью. Основной файл Code.gs веб-приложения выглядит следующим образом.
function doGet() {
return HtmlService.createHtmlOutputFromFile('Index.html');
}
function getUserBackendData(){
//works for users outside our domain
var activeUserEmail = Session.getActiveUser();
var apiKey = 'abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc'
var scriptId = 'ababababababababababababababababababababababab';
var token = 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd'; //very secret
var url = 'https://script.googleapis.com/v1/scripts/'+ scriptId +':run?key='+ apiKey;
var functionCallData =
{
"function": 'retrieveData',
"parameters": [activeUserEmail],
"devMode": false};
var options = {
'method' : 'post',
'contentType': 'application/json',
'payload' : JSON.stringify(functionCallData),
'headers': {'Authorization': 'Bearer '+ token}
};
return UrlFetchApp.fetch(url, options).getContentText();
}
Идея состоит в том, что это позволяет нам выполнять функцию retrieveData(activeUserEmail)
в нашем исполняемом файле API в качестве привилегированного пользователя, используя веб-приложение для определения адреса электронной почты пользователя, обращающегося к приложению. Причина, по которой Session.getActiveUser()
теперь работает для пользователей за пределами нашего домена, заключается в том, что мы используем "executeAs": "USER_ACCESSING"
.
Вопросы)
Мы обеспокоены тем, что 1) существует более простой/лучший способ сделать это и 2) пользователь, обращающийся к веб-приложению, может каким-то образом получить токен, используемый для вызова функции в исполняемом файле API, который, как мы опасаемся, может быть использован для кражи личных данных.
Этот вопрос и ответ затрагивает проблему 2. К сожалению, в ответах не цитируется какая-либо официальная документация/ресурсы (и не все согласны) . Причем там секретный библиотечный ключ отсутствует в исходном коде веб-приложения (он есть в файле манифеста), тогда как в нашем случае секретный токен есть в исходном коде.
Вопрос. Является ли эта альтернативная установка безопасной и разумной?
Обновление: я только что нашел этот ответ, написанный пользователем, который кажется заслуживающим доверия. В ответе говорится, что пользователь веб-приложения не сможет увидеть код веб-приложения, даже если приложение развернуто как «Любой, даже анонимный». Однако это утверждение подстраховано фразой «То, о чем я знаю».
USER_ACCESSING
, приложение будет использовать OAuth, чтобы запросить разрешения для своей учетной записи Google. - person Jescanellas   schedule 06.08.2019DriveApp.getFiles()
пользователю веб-приложения предлагается предоставить приложению разрешение на просмотр файлов на его диске. Если области управляются автоматически, эти области не будут видны в файле манифеста, верно? Я всегда ищу их в File > Project Properties > Scopes... - person jano   schedule 06.08.2019'headers': {'Authorization': 'Bearer '+ token}
, я получаю сообщение об ошибке. В запросе отсутствуют необходимые учетные данные аутентификации. Ожидаемый токен доступа OAuth 2, файл cookie для входа или другие действительные учетные данные для аутентификации. См. developers.google.com/identity/sign-in/web/devconsole. -проект. Единственная область, которая автоматически вводится таким образом при использовании UrlFetchApp, — это script.external_request. И опять же, даже если скрипт запросит правильные области видимости, он запросит доступ не у того пользователя... - person jano   schedule 06.08.2019UrlFetchApp
. - person jano   schedule 06.08.2019