Как я могу выполнить функцию скрипта Google Apps от имени пользователя, используя HTTP-запрос с токеном доступа в заголоAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как я могу выполнить функцию скрипта Google Apps от имени пользователя, используя HTTP-запрос с токеном доступа в заголо

Сообщение Anonymous »

Я пытаюсь создать онлайн-сервис для своего приложения Android с помощью скрипта Google Apps. Пользователи просто входят в свою учетную запись Google внутри приложения, предоставляют необходимые разрешения соответствующему GCP, а затем приложение позаботится о получении токенов доступа с токеном обновления для вызова службы от имени пользователя. Основная цель — изменить электронную таблицу на диске пользователя. Это функциональность, которую я хочу достичь, теперь поговорим о технических деталях.
Я создал проект GCP и Google Apps Script (GAS). В настройках GASP я установил идентификатор созданного мной GCP (вместо дефолтного). В GCP я создал 2 клиента:
  • Приложение Android, использующее мой SHA-1 и имя пакета.
  • Веб-клиент для управления токенами OAuth.
В своем приложении Android я использую библиотеку com.google.android.gms:play-services-auth для запроса разрешения пользователя с необходимыми областями OAuth (в этом случае https://www.googleapis.com/auth/spreadsheets). Библиотека правильно предлагает диалоговое окно предоставить разрешение моему приложению, и процесс завершается успешно. Отсюда я использую пользовательский GASP (не связанный с предыдущим GCP) для обмена кодом авторизации на токены обновления и доступа, а также для получения новых токенов доступа из токена обновления. Приложение может без проблем вызывать эти функции, и обмены с серверами OAuth Google выполняются правильно. Если я зайду в свою учетную запись Google (отличную от той, которая содержит GCP и GASP), я увижу соединение с моим приложением, авторизации отображаются правильно.
Теперь я хочу выполнить свою функцию в GASP, который в настоящее время просто создает электронную таблицу на Диске пользователя, выполняя запрос GET. Вот как выглядит настоящая функция:

Код: Выделить всё

function doGet(e) {
let r = {}
try {
SpreadsheetApp.create("TEST")
r.status = "ok"
} catch (e) {
r.status = e.message
}
return ContentService.createTextOutput(JSON.stringify(r)).setMimeType(ContentService.MimeType.JSON)
}
Я развернул его как веб-приложение, чтобы оно выполнялось от имени пользователя, который имеет к нему доступ, и открывалось для всех, у кого есть учетная запись Google.
Если я открываю вкладку браузера, войдите в систему, используя свою авторизованную учетную запись Google, и перейдите к https://script.google.com/macros/s/AKfy ... 518PhbpH6r[...]N1A/exec, браузер отображает JSON со статусом "status":"ok", и на моем Диске создается электронная таблица. Поскольку сообщение об ошибке не появляется, я предполагаю, что у GASP есть необходимые разрешения (уже предоставленные с помощью моего приложения для Android). Затем я хотел выполнить этот запрос GET из своего приложения для Android или, по сути, из любого другого места, поддерживающего HTTP-запрос. После того, как я установил OkHttpClient с Authenticator и Interceptor, которые отвечают за аутентификацию, я не смог выполнить эту функцию из своего приложения, я всегда получаю ошибку 401. Я смоделировал свой запрос в приложении Android в другом GASP (просто среда, которая позволяет мне выполнять запросы GET):

Код: Выделить всё

function request() {
let r = UrlFetchApp.fetch(
"https://script.google.com/macros/s/AKfycbx-sD70nS3Ee518PhbpH6ru_xWgCGr9Cj5pJBCjr[...]N1A/exec",
{
method: "get",
muteHttpExceptions: true,
headers: {
'Authorization': `Bearer ${ACCESS_TOKEN}`
}
}
)
Logger.log(r.getResponseCode())
Logger.log(r.getContentText())
}
и, что неудивительно, я получаю ошибку 401, а контекстом является HTML-код от Google, в котором говорится, что у меня нет доступа. Итак, моя конкретная проблема связана не с частью Android, а с аутентификацией при вызове запроса GET моего GASP. Просто для пояснения: во время тестирования я получил новый токен доступа, просто чтобы убедиться, что срок его действия не истек. Я искал в Интернете, и это предполагаемый способ сделать это, но он просто не работает. Любая помощь будет очень признательна!

Подробнее здесь: https://stackoverflow.com/questions/798 ... using-an-h
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»