Использовать сервисный аккаунт

Вы можете использовать сервисные учетные записи в ваших Соединителях сообщества для централизованного управления доступом к ресурсам. Распространенным вариантом использования было бы делегирование доступа к данным, к которым пользователи не смогут получить доступ, используя свои собственные учетные данные.

Ознакомьтесь с разделом Общие сведения об учетных записях служб , чтобы ознакомиться с этой темой.

Преимущества

  • Вы можете объединить счета за доступ к данным.
  • Вы можете реализовать свой собственный уровень управления доступом в своем соединителе.
  • Вы можете делегировать доступ к данным или ресурсам, к которым учетные данные пользователя не имеют доступа.

Этапы реализации

  1. Создайте сервисную учетную запись для платформы, с которой вы получаете данные.
  2. Предоставьте необходимые разрешения учетной записи службы, чтобы она могла получить доступ к необходимым ресурсам.
  3. Сохраните учетные данные учетной записи службы в свойствах сценария вашего соединителя.
  4. Во время выполнения соединителя используйте сохраненные учетные данные для получения необходимых данных.
  5. Необязательно : реализуйте логику управления доступом для фильтрации данных.

Пример. Доступ к BigQuery с помощью расширенных служб Looker Studio и учетной записи службы.

Вы создаете решение, в котором ваши пользователи будут создавать информационные панели на основе таблицы BigQuery. Если ваши пользователи используют коннектор BigQuery Looker Studio, им потребуется доступ для чтения к таблице BigQuery. Им также потребуется платежный аккаунт для Google Cloud Platform (GCP). Следующие шаги показывают, как использовать сервисный аккаунт для консолидации счетов и делегирования доступа к данным BigQuery.

  1. Создайте сервисную учетную запись в желаемом проекте GCP.
  2. Убедитесь, что сервисный аккаунт может создавать задания BigQuery и просматривать данные для необходимой таблицы. Подробности см. в разделе «Контроль доступа BigQuery» .
  3. Создайте ключ для учетной записи службы и сохраните учетные данные в свойствах сценария вашего соединителя.
  4. Включите библиотеку скриптов приложений OAuth2 в свой проект скриптов приложений.
  5. Для функции getData выполните аутентификацию учетной записи службы и сгенерируйте токен доступа. Установите область OAuth2 https://www.googleapis.com/auth/bigquery.readonly .
  6. Верните токен доступа с другими элементами конфигурации в ответе getData .

main.js

var cc = DataStudioApp.createCommunityConnector();
var scriptProperties = PropertiesService.getScriptProperties();

function isAdminUser() {
  return true;
}

function getAuthType() {
  var AuthTypes = cc.AuthType;
  return cc
    .newAuthTypeResponse()
    .setAuthType(AuthTypes.NONE)
    .build();
}

function getConfig(request) {
  var config = cc.getConfig();

  config
    .newInfo()
    .setId('generalInfo')
    .setText('This is an example connector to showcase row level security.');

  return config.build();
}

function getFields() {
  var fields = cc.getFields();
  var types = cc.FieldType;
  var aggregations = cc.AggregationType;

  fields
    .newDimension()
    .setId('region')
    .setName('Region')
    .setType(types.TEXT);

  fields
    .newMetric()
    .setId('sales')
    .setName('Sales')
    .setType(types.NUMBER)
    .setAggregation(aggregations.SUM);

  fields
    .newDimension()
    .setId('date')
    .setName('Date')
    .setType(types.YEAR_MONTH_DAY);

  return fields;
}

function getSchema(request) {
  return {schema: getFields().build()};
}

var SERVICE_ACCOUNT_CREDS = 'SERVICE_ACCOUNT_CREDS';
var SERVICE_ACCOUNT_KEY = 'private_key';
var SERVICE_ACCOUNT_EMAIL = 'client_email';
var BILLING_PROJECT_ID = 'project_id';

/**
 * Copy the entire credentials JSON file from creating a service account in GCP.
 */
function getServiceAccountCreds() {
  return JSON.parse(scriptProperties.getProperty(SERVICE_ACCOUNT_CREDS));
}

function getOauthService() {
  var serviceAccountCreds = getServiceAccountCreds();
  var serviceAccountKey = serviceAccountCreds[SERVICE_ACCOUNT_KEY];
  var serviceAccountEmail = serviceAccountCreds[SERVICE_ACCOUNT_EMAIL];

  return OAuth2.createService('RowLevelSecurity')
    .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
    .setPrivateKey(serviceAccountKey)
    .setIssuer(serviceAccountEmail)
    .setPropertyStore(scriptProperties)
    .setCache(CacheService.getScriptCache())
    .setScope(['https://www.googleapis.com/auth/bigquery.readonly']);
}

var BASE_SQL =
  'SELECT d.region, d.sales, d.date ' +
  'FROM `datastudio-solutions.row_level_security.data` d ' +
  'INNER JOIN `datastudio-solutions.row_level_security.access` a ' +
  'ON d.region = a.region ' +
  'where a.email=@email';

function getData(request) {
  var accessToken = getOauthService().getAccessToken();
  var serviceAccountCreds = getServiceAccountCreds();
  var billingProjectId = serviceAccountCreds[BILLING_PROJECT_ID];
  var email = Session.getEffectiveUser().getEmail();

  var bqTypes = DataStudioApp.createCommunityConnector().BigQueryParameterType;

  return cc
    .newBigQueryConfig()
    .setAccessToken(accessToken)
    .setBillingProjectId(billingProjectId)
    .setUseStandardSql(true)
    .setQuery(BASE_SQL)
    .addQueryParameter('email', bqTypes.STRING, email)
    .build();
}