Ответ 1
РЕДАКТИРОВАТЬ 1: непроверенный пример кода
Итак, я очень заинтересовался этим, и мне было несколько минут, чтобы слить код. Я решил построить крошечный Express-сервер, чтобы получить токен доступа, но все равно выполняю загрузку с клиента. Я использовал fetch
для загрузки, а не для клиентской библиотеки.
У меня нет учетной записи Google в облаке, и поэтому я ее не тестировал, поэтому я не могу подтвердить, что она работает, но я не понимаю, почему это не должно. Код на моем GitHub здесь.
Прочитайте его и внесите необходимые изменения, прежде чем пытаться запустить его. Прежде всего, вам нужно указать расположение файла закрытого ключа, а также убедиться, что оно есть, и вам нужно установить имя ведра в index.html
.
Конец редактирования 1
Отказ от ответственности: я когда-либо использовал библиотеку клиентов Node.js Google для отправки электронных писем, но я думаю, что у меня есть основное понимание API Google.
Чтобы использовать любую службу Google, нам нужны токены доступа, чтобы подтвердить нашу личность; однако, поскольку мы хотим, чтобы любой пользователь мог загружаться в наш собственный контейнер Cloud Storage, нам не нужно проходить стандартный процесс OAuth.
Google предоставляет то, что они называют учетной записью службы, которая является учетной записью, которую мы используем для идентификации экземпляров наших собственных приложений, которые получают доступ к нашим собственным ресурсам. Принимая во внимание, что в стандартном процессе OAuth нам нужно будет идентифицировать наше приложение в службе, согласитесь с пользователем использовать наше приложение (и, таким образом, предоставить нам разрешение), получить токен доступа для этого конкретного пользователя, а затем сделать запросы к службе; с учетной записью службы мы можем пропустить процесс согласия пользователя, поскольку мы, в некотором смысле, наш собственный пользователь. Использование учетной записи службы позволяет нам просто использовать наши учетные данные, созданные с помощью консоли Google API, для создания JWT (токена JSON), который затем используется для получения токена доступа, который мы используем для запросов к службе облачного хранилища. См. здесь для руководства Google по этому процессу.
В прошлом я использовал пакеты, такие как этот для создания JWT, но я не мог найти никаких клиентских библиотек для кодирования JWT-х; главным образом потому, что они генерируются почти исключительно на серверах. Тем не менее, я нашел этот учебник, который, на беглом взгляде, кажется достаточным для написания нашего собственного алгоритма кодирования.
Я хотел бы отметить здесь, что открытие приложения, которое позволит публичному свободному доступу к вашим ресурсам Google, может оказаться вредным для вас или вашей организации в будущем, так как я уверен, что вы рассмотрели. Это серьезный риск для безопасности, поэтому все обучающие программы, которые вы видели до сих пор, реализовали две последовательные загрузки.
Если бы это был я, я бы выполнил хотя бы первую часть процесса аутентификации на моем сервере: когда пользователь будет готов к отправке, я отправил бы запрос на мой сервер для создания токена доступа для служб Google, используя мой учетные данные учетной записи службы, а затем я отправил каждому пользователю новый токен доступа, который был создан моим сервером. Таким образом, у меня есть дополнительный уровень безопасности между внешним миром и моей учетной записью Google, поскольку бремя проверки подлинности лежит на моем сервере, и только загрузка выполняется клиентом.
В любом случае, если у нас есть токен доступа, мы можем использовать функцию CORS, которую Google предоставляет для загрузки файлов в наше ведро. Эта функция позволяет нам использовать стандартные запросы XHR 2
для использования сервисов Google и в основном предназначена для использования вместо клиентской библиотеки JavaScript, Я бы предпочел использовать функцию CORS поверх клиентской библиотеки только потому, что я считаю ее немного более простой и немного более гибкой в ее реализации. (Я не тестировал это, но я думаю, что fetch
будет работать здесь так же, как и XHR 2
.).
Теперь нам нужно получить файл от пользователя, а также любую информацию, которую мы хотим от них относительно файла (read: имя файла), а затем сделать запрос POST
на https://www.googleapis.com/upload/storage/v1/b/<BUCKET_NAME_HERE>/o
( заменив имя вашего ведра, конечно) с помощью токена доступа, добавленного к URL-адресу, в разделе "Выполнение аутентифицированных запросов" Страница функций CORSи любые другие параметры в строке body/query, которые вы хотите включить, в соответствии с Документация по облачному хранилищу API при вставке объекта. Список API для службы облачного хранения можно найти здесь для справки.
Как я никогда раньше этого не делал, и у меня нет возможности проверить это, у меня нет никакого образца кода для включения в мой ответ, но я надеюсь, что мой пост достаточно ясен, чтобы вместе код должен быть относительно прост отсюда.
Просто, чтобы установить запись прямо, я всегда находил OAuth довольно запутанным и вообще избегал играть с ним из-за моего страха перед его неизвестными. Тем не менее, я думаю, что я, наконец, освоил его, особенно после этого поста, поэтому я не могу дождаться, чтобы получить свободный час, чтобы поиграть с ним.
Пожалуйста, дайте мне знать, если что-то, что я сказал, не ясен или последователен.