Авторизация OAuth 2.0: GAS и Google Maps Engine

У меня есть проект Google Maps Engine, в котором источник данных может обновляться через Google Forms/Google Apps Script. Я знаю, что есть способ настроить OAuth в GAS ( https://developers.google.com/apps-script/reference/url-fetch/o-auth-config), но я не могу понять, как это сделать работать после нескольких часов чтения документации GAS и GME. Мне удалось обойти это с помощью OAuth Playground для получения токена доступа, но мне нужно вручную обновлять каждый час. Я знаю, что ответ, вероятно, прост, но я новичок в OAuth, и я не могу найти простое руководство, чтобы помочь мне.

Как мне заставить мой скрипт Google Apps хорошо играть с Google Maps Engine через OAuth?

Я включил, как я в настоящее время доступ к GME ниже:

    /* This function is called when a new provider is added through the "Medical Providers" form
   It sends an HTTP request to Google Maps Engine to add the new provider to the map */
function addNewtoTable(row){
  var aPIKey = "MY_API_KEY";
  var bearer = "ACCESS_TOKEN_FROM_OAUTH_PLAYGROUND";
  var projectID = "MY_PROJECT_ID";
  var tableID = "MY_TABLE_ID";
  //tutorial here https://developers.google.com/maps-engine/documentation/tutorial
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Providers");

  var address = sheet.getRange(row,2).getValue();
  var response = Maps.newGeocoder().geocode(address);
  for (var j = 0; j < response.results.length; j++) {
    var result = response.results[j];
    //Logger.log('%s: %s, %s', result.formatted_address, result.geometry.location.lat,
    //             result.geometry.location.lng);
  };
  var lat = result.geometry.location.lat;
  var long = result.geometry.location.lng;
  var name= '"'+sheet.getRange(row,1).getValue()+'"';
  var phone= '"'+sheet.getRange(row,4).getValue().toString()+'"';
  var email= '"'+sheet.getRange(row,3).getValue()+'"';
  var inbounds= '"'+sheet.getRange(row,5).getValue().toString()+'"';
  var outbounds = '"'+sheet.getRange(row,6).getValue().toString()+'"';
  var lastIn = '" '+sheet.getRange(row,7).getValue().toString()+' "';
  var lastOut = '" '+sheet.getRange(row,8).getValue().toString()+' "';
  var gxid = '"'+sheet.getRange(row,9).getValue().toString()+'"';

  //HTTP request goes here
  var payload = '{features:[{type: "Feature",geometry:{type: "Point",coordinates: ['+long+','+lat+']},properties: {gx_id: '+gxid+',name: '+name+',phone:'+phone+',email:'+email+',inbound:'+inbounds+',outbound:'+outbounds+',last_inbound:'+lastIn+',last_outbound:'+lastOut+'}}]}';
  Logger.log(payload);


  var headers = {"Authorization": "Bearer ACCESS_TOKEN_FROM_OAUTH_PLAYGROUND", "Content-type": "application/json"};
  var options ={"method" : "post","headers" : headers, "payload" : payload, "muteHttpExceptions" : true};
  var httpresponse = UrlFetchApp.fetch("https://www.googleapis.com/mapsengine/v1/tables/MY_TABLE_ID/features/batchInsert",options);
  Logger.log(httpresponse);

  if (httpresponse!=""){
    MailApp.sendEmail('MY_EMAIL', 'HTTP Request Failed to Send', httpresponse);
  };
};

2 ответа

Это конечно возможно. Документы App Script содержат учебное пособие, объясняющее, как подключиться к удаленному сервису, используя OAuth, который в качестве примера использует API Twitter. В этом примере также показано выполнение авторизованного вызова OAuth.

Основным отличием в учебнике для Maps Engine является первый шаг, когда вы не настраиваете Twitter, а настраиваете в консоли разработчика.

  • Вы хотите создать новый идентификатор клиента OAuth в разделе APIs & Auth -> Credentials. Это веб-приложение.
  • Вместо того, чтобы устанавливать "URL обратного вызова" в Twitter, вы будете устанавливать "URI авторизованного перенаправления" в консоли при создании идентификатора клиента. На всякий случай установите авторизованные источники на docs.google.com.
  • Вы также получите свои "Ключ потребителя" и "Секрет потребителя" через console.developers.google.com, они соответствуют идентификатору клиента и Секрету клиента, которые упоминаются в этом документе GME.

В дополнение к настройке, эти указатели могут помочь вам.

  • UrlFetchApp.addOauthService("twitter") звонки могут использовать любую строку в качестве идентификатора, в фразе "twitter" нет ничего особенного, но она должна соответствовать oAuthServiceName
  • URL-адреса, которые вам нужны, должны выглядеть так (они взяты отсюда):
    • oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
    • oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope); Область действия объяснена здесь.
    • oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");

Слишком поздно для моих целей, но я обнаружил, что Google сам создал библиотеку для GAS, которая поддерживает OAuth 2.0. Почему это не входит в ГАЗ, вне меня. Это также выглядит довольно недавно, с некоторыми обновлениями от 5 дней назад.

Другие вопросы по тегам