Веб-доступ к Google Таблицам
Доступ к Google Таблицам зависит от того, какие учётные данные вы приносите с собой. На развёрнутом сайте есть два равноправных пути входа: войти через Google (OAuth) или выбрать файл ключа сервисного аккаунта, которым напрямую пользуется ваш собственный браузер. Путь Unity / локально сохраняет свой машинно-локальный ключ сервисного аккаунта без изменений.
На развёрнутом сайте — OAuth, чтение и запись
На развёрнутом сайте вошедший пользователь может и читать, и писать Google Таблицы через собственный OAuth-токен.
- Минимум привилегий. Вход запрашивает ваш базовый профиль и доступ к таблицам на уровне отдельных файлов (
drive.file): приложение может читать и записывать только те файлы таблиц, которые вы явно открыли для него. Ничего в масштабе всего аккаунта — оно не может ни получить список, ни просмотреть остальную часть вашего Drive, а файл, который вы для него не открывали, остаётся невидимым. - Тот же самый план ядра. Запись в вебе проходит через точно тот же план ядра и ту же общую проверку оптимистичной блокировки, что и любой другой путь, — живая таблица заново проверяется непосредственно перед отправкой, так что ячейка, которую третья сторона изменила после вашего импорта, пропускается, а не перезаписывается. Различается только транспортный уровень: на этом пути он несёт bearer-токен OAuth.
- ACL таблицы — последняя инстанция. SheetForge не решает, кто может писать, — решает Google.
403от Google переотображается в честное сообщение о правах доступа, а не в частичную запись, так что отказ читается как отказ.
Токен OAuth хранится в сессионной cookie (JWT) и используется серверными действиями. Единственное исключение — диалог выбора файла Google, описанный далее: это виджет Google, который выполняется на странице, поэтому его открытие выдаёт странице короткоживущий токен доступа для вашей собственной сессии.
Начать с диалога выбора — ID никогда не нужен
Вкладка для вошедших пользователей начинается с кнопки Выбрать таблицу в Google Таблицах: открывается собственный диалог выбора файла Google, вы выбираете таблицу, её ID попадает в панель, и импорт запускается сам собой. Выбор — это ещё и то, что даёт приложению доступ к этому файлу в рамках drive.file, так что один жест делает и то, и другое. Строка Текущая таблица показывает, на что сейчас нацелена панель.
Ввод ID вручную по-прежнему работает — он переехал под сворачиваемый блок Дополнительно: начать с идентификатора таблицы, а ранее сохранённый ID продолжает работать точно как раньше. Честная оговорка сформулирована прямо там: Google открывает только те файлы, которые вы хотя бы раз выбрали, поэтому ID файла, который никогда не выбирался, отклоняется, пока вы его не выберете (об этом ниже говорит строка Разрешить доступ к файлу…).
Открытие файла для приложения — один раз
В рамках drive.file разрешение растёт файл за файлом. Если приложение натыкается на таблицу, к которой у него ещё нет доступа, — ID, введённый в разделе «Дополнительно», сохранённый ID после смены аккаунта, — оно открывает собственный диалог выбора файла Google с уже найденной этой таблицей, в момент, когда оно натыкается на ошибку доступа. Выберите файл один раз — и импорт или отправка, которые вы начали, завершатся сами собой. С этого момента эта таблица ведёт себя точно так же, как и всегда.
- Готовить ничего заранее не нужно. Вы не предоставляете доступ заблаговременно; диалог появляется именно тогда, когда он нужен, уже настроенным на нужный файл, а запрошенное вами действие после выбора автоматически повторяется само.
- Предоставить доступ заново всегда легко. На панели Google всегда есть строка Разрешить доступ к файлу…, которая в любой момент открывает тот же диалог — например, после переключения на другой аккаунт Google.
- Честная граница. Диалог — это виджет Google, работающий на странице, поэтому, пока он используется, страница хранит короткоживущий токен доступа (действителен не более часа) для вашей сессии, полученный с эндпоинта того же источника (same-origin), который требует вашего входа в систему. Это то же самое доверие, которое путь с файлом ключа, описанный ниже, оказывает странице, — эту страницу защищает строгая Content Security Policy приложения. Токен не сохраняется и не протоколируется.
Вкладка с файлом ключа намеренно сохраняет своё поле ID: у сервисного аккаунта нет сессии браузера с входом в систему, через которую можно было бы выбирать файл, поэтому ID — вместе с таблицей, расшаренной для аккаунта, — остаётся честным способом попасть туда.
На развёрнутом сайте — файл ключа сервисного аккаунта, подписываемый вашим браузером
Вторая вкладка панели Google принимает файл JSON-ключа сервисного аккаунта. Всё, что делает этот ключ, происходит в вашем браузере:
- Ключ никогда не попадает на сервер. Сам браузер подписывает запрос токена и обращается к API Google напрямую, так что ключ, подписанный запрос, токен доступа и данные вашей таблицы никогда не касаются серверов SheetForge. Серверные маршруты сервисного аккаунта на развёрнутом сайте остаются закрыты шлюзом (
501), точно как прежде, — этот путь добавляет возможность, не открывая ни одной. - Запоминание ключа честно о том, что оно хранит. Если вы решите запомнить ключ, текст файла отбрасывается немедленно; то, что сохраняется — на этом устройстве, в хранилище браузера, — это ключ подписи, которым скрипты на странице могут пользоваться, но никогда не могут считать обратно. Любой, кто способен открыть этот профиль браузера, всё же смог бы его восстановить, так что относитесь к этому устройству так, будто на нём лежит файл ключа. Забыть ключ удаляет его немедленно во всех открытых вкладках, и приложение также просит Google отозвать текущий токен доступа.
- Тот же план, та же проверка. Чтение и запись проходят через тот же план ядра и ту же проверку перед отправкой, что и другие пути.
Путь Unity / локально
Ключ сервисного аккаунта, который используют Unity и локальный сервер разработки, читается из машинно-локального пути и никогда не загружается и не упаковывается — это тот же ключ, что описан в Настройке Google Таблиц; храните его вне Assets/ и вне репозитория. Репозиторий не содержит учётных данных.
Выпадающие списки обновляются при каждой отправке
После отправки из веб-приложения выпадающие списки проверки данных таблицы автоматически переписываются — все вкладки одним пакетом, при этом выпадающий список столбца-ссылки записывается как диапазон по ключевому столбцу целевого листа, так что он растёт по мере добавления записей. Правило, нацеленное на несуществующую вкладку листа, пропускается и сообщается отдельно. Это совпадает с тем, что пишет отправка в Google из редактора.
Какой путь что делает
| Где вы работаете | Учётные данные Google | Чтение | Запись |
|---|---|---|---|
| Unity / локально | Ключ сервисного аккаунта, читается из локального пути на машине | Да | Да — точечная запись ячеек, перезапись структуры, отправка |
| Развёрнутый сайт | OAuth-токен вошедшего пользователя (drive.file — файлы, открытые для приложения) | Да | Да — тот же план ядра + проверка оптимистичной блокировки |
| Развёрнутый сайт | Файл ключа сервисного аккаунта, который вы выбираете, используется напрямую вашим браузером | Да | Да — тот же план ядра и та же проверка; запросы идут из вашего браузера прямо в Google |
| Развёрнутый сайт | Серверные маршруты сервисного аккаунта | — | Закрыты шлюзом (501) |
Поведение записи идентично независимо от того, где оно выполняется, потому что каждый путь разделяет план ядра и проверку перед отправкой. Меняется только транспорт — подписанный браузером токен сервисного аккаунта, bearer-токен OAuth конкретного пользователя или ключ локального сервера.
Похожие страницы
- Настройка Google Таблиц — создание сервисного аккаунта и JSON-ключа для пути Unity
- Источники, экспорт и отправка — цепочка безопасности отправки, которую разделяет веб-путь записи
- SheetForge Web — браузерное приложение, в котором живёт этот доступ