Можно ли получить доступ к развернутому Защищенному веб-приложению Google через URL-адрес, не входя каждый раз из браузера? - PullRequest
0 голосов
/ 20 февраля 2019

Я развернул защищенное веб-приложение и хотел бы запускать его без входа в систему каждый раз: enter image description here

Я хочу получить доступ к веб-приложениюURL без входа в систему: enter image description here

На основании этого документа невозможно без входа в систему из браузера: https://github.com/tanaikech/taking-advantage-of-Web-Apps-with-google-apps-script/blob/master/README.md

ЕслиВ сценарии веб-приложений используются некоторые области, пользователи клиента должны авторизовать области с помощью собственного браузера.

Я предполагаю, что scopes означает, что веб-приложение защищено.

IЯ пробовал это: https://github.com/gsuitedevs/apps-script-oauth2/blob/master/samples/GoogleServiceAccount.gs, но он запрашивает "запрос доступа"

https://i.imgur.com/eRUaXlh.png

Если я нажму request access, то онпоказывает мне это: enter image description here

На данный момент, я думаю, что невозможно настроить учетную запись службы с областью действия для запуска защищенного развернутого веб-приложения без проверки подлинности через браузер каждыйвремя.Кто-нибудь может это подтвердить?

Я предполагаю, что область действия веб-приложения равна https://www.googleapis.com/auth/drive, поскольку у него есть доступ ко всем файлам диска.

Обновление: (что я пробовал, но не работало)

Я сопоставил область действия из сценария:

enter image description here

Для учетной записи службы:

enter image description here

размытой областью выше является идентификатор клиента, от которого я получил:

enter image description here

Я сгенерировалтокен доступа с помощью этого сценария:

function accessTokens(){
 var private_key = "-----BEGIN PRIVATE KEY-----*****\n-----END PRIVATE KEY-----\n"; // private_key of JSON file retrieved by creating Service Account
var client_email = "****@****.iam.gserviceaccount.com"; // client_email of JSON file retrieved by creating Service Account
var scopes = ["https://www.googleapis.com/auth/documents","https://www.googleapis.com/auth/forms","https://www.googleapis.com/auth/script.external_request","https://www.googleapis.com/auth/spreadsheets","https://www.googleapis.com/auth/userinfo.email"]; // Scopes


var url = "https://www.googleapis.com/oauth2/v3/token";
var header = {
  alg: "RS256",
  typ: "JWT",
};
var now = Math.floor(Date.now() / 1000);
var claim = {
  iss: client_email,
  scope: scopes.join(" "),
  aud: url,
  exp: (now + 3600).toString(),
  iat: now.toString(),
};
var signature = Utilities.base64Encode(JSON.stringify(header)) + "." + Utilities.base64Encode(JSON.stringify(claim));
var jwt = signature + "." + Utilities.base64Encode(Utilities.computeRsaSha256Signature(signature, private_key));

var params = {
  method: "post",
  payload: {
    assertion: jwt,
    grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
  },
};
var res = UrlFetchApp.fetch(url, params).getContentText();
Logger.log(res); 
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("Sheet1");
  sheet.getRange(1, 3).setValue(JSON.parse(res)['access_token']);
}

И по-прежнему имеет ту же ошибку, он запрашивает доступ доступа.

1 Ответ

0 голосов
/ 21 февраля 2019

Через пару дней после этого я понял (с помощью, конечно).

  1. Получите область действия из развернутого сценария веб-приложения: File > Project Properties > Scopes
  2. Добавьте область вместе с https://www.googleapis.com/auth/drive на странице Manage API client access https://admin.google.com/AdminHome?chromeless=1#OGX:ManageOauthClients (используйте запятую для добавления нескольких областей: http...,http..., etc.)
  3. Для имени клиента получите идентификатор клиента изСтраница служебной учетной записи в консоли администратора: https://console.developers.google.com
  4. Развертывание сценария Publish > Deploy as Web App
  5. После генерации токена доступа (инструкция ниже) добавьте токен доступа к URL-адресу развернутого веб-приложения &access_token=YOURTOKENHERE

Используйте этот скрипт с листом Google, он сгенерирует access_token в ячейке A1 из Sheet1 (замените 4 переменные информацией, относящейся к вам):

function accessTokens(){
 var private_key = "-----BEGIN PRIVATE KEY-----n-----END PRIVATE KEY-----\n"; // private_key of JSON file retrieved by creating Service Account
var client_email = "*****@****.iam.gserviceaccount.com"; // client_email of JSON file retrieved by creating Service Account
var scopes = ["https://www.googleapis.com/auth/documents","https://www.googleapis.com/auth/forms","https://www.googleapis.com/auth/script.external_request","https://www.googleapis.com/auth/spreadsheets","https://www.googleapis.com/auth/userinfo.email","https://www.googleapis.com/auth/drive"]; // Scopes
var impersonate_email = "" //impersonate email

var url = "https://www.googleapis.com/oauth2/v4/token";
var header = {
  alg: "RS256",
  typ: "JWT",
};
var now = Math.floor(Date.now() / 1000);
var claim = {
  iss: client_email,
  sub: impersonate_email,
  scope: scopes.join(" "),
  aud: url,
  exp: (now + 3600).toString(),
  iat: now.toString(),
};
var signature = Utilities.base64Encode(JSON.stringify(header)) + "." + Utilities.base64Encode(JSON.stringify(claim));
var jwt = signature + "." + Utilities.base64Encode(Utilities.computeRsaSha256Signature(signature, private_key));

var params = {
  method: "post",
  payload: {
    assertion: jwt,
    grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
  },
};
var res = UrlFetchApp.fetch(url, params).getContentText();
Logger.log(res); 
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("Sheet1");
  sheet.getRange(1, 1).setValue(JSON.parse(res)['access_token']);
}
...