Использование «USER_PASS» с разъемом datastudio - PullRequest
0 голосов
/ 05 ноября 2018

У меня возникли некоторые проблемы при настройке аутентификации типа "USER_PASS" для моего разъема datastudio, и мне было трудно найти адекватные примеры (официальная документация предлагает, но частичную картину). Кто-нибудь настраивал это раньше, и не могли бы вы поделиться со мной, как вам пришлось это настраивать? Если у кого-то есть ссылка на пример, который очень помог бы, спасибо!

1 Ответ

0 голосов
/ 09 ноября 2018

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


В основном вам понадобится комбинация вещей. Первым было бы реализовать getAuthType () , чтобы сообщить Data Studio, что может потребоваться отобразить такую ​​маску:

function getAuthType() {      
  return {
    type: 'USER_PASS'
  };
};

Тогда, поскольку вы используете USER_PASS, Data Studio вызывает isAuthValid () и ожидает, что он вернет Boolean. Всякий раз, когда вы находитесь на первой странице конфигурации для источника данных, который использует ваш соединитель, эта функция вызывается. Если он вернет false, будет показана маска, подобная этой:

imageUSER_PASS">

Но если он вернет true, этот шаг будет перепрыгнут.

Но в чем логика, спросите вы? Я сам и соединитель kaggle использую UserProperties , чтобы сохранить имя пользователя / пароль для использования этого источника данных. Вы можете проверить наличие правильных учетных данных и подтвердить их подлинность через конечную точку REST и вернуть свой Boolean в соответствии с этим. Это может выглядеть примерно так:

function isAuthValid() {
  const usernameAndPassword = loadUsernameAndPassword();
  return usernameAndPassword.username && usernameAndPassword.password && validateCredentials(usernameAndPassword.username, usernameAndPassword.password)
};

loadCurrentUsernameAndPassword() просто загружает их из UserProperties :

function loadCurrentUsernameAndPassword() {
  const properties = PropertiesService.getUserProperties();
  return {
    username: properties.getProperty('dscc.username'),
    password: properties.getProperty('dscc.password')
  }
};

validateCredentials() объясняется ниже.


Когда пользователь вводит свое имя пользователя / пароль и нажимает кнопку Send (я полагаю, это называется на английском языке), Data Studio затем вызывает setCredentials () , что вам нужно будет реализовать. Вам, вероятно, потребуется позвонить на конечную точку REST, отправить имя пользователя / пароль и обработать ответ. Это может выглядеть примерно так:

function setCredentials(request) {
  var isCredentialsValid = validateCredentials(request.userPass.username, request.userPass.password);
  if (!isCredentialsValid) {
    return {
      errorCode: "INVALID_CREDENTIALS"
    };
  } else {
    storeUsernameAndPassword(request.userPass.username, request.userPass.password);
    return {
      errorCode: "NONE"
    };
  }
};

Как видите, я ввел 2 новые функции.

Первая новая функция validateCredentials() фактически отправляет учетные данные конечной точке REST, используя UrlFetchApp :

function validateCredentials(username, password) {
  var rawResponse = UrlFetchApp.fetch('path/to/your/authentication/endpoint', {
    method: 'GET',
    headers: {
      'Authorization': 'Basic ' + Utilities.base64Encode(username + ':' + password)
    },
    muteHttpExceptions: true
  });

  return rawResponse.getResponseCode() === 200;
}

Вторая новая функция storeUsernameAndPassword() сохраняет имя пользователя / пароль в UserProperties :

function storeUsernameAndPassword(username, password) {
  PropertiesService
    .getUserProperties()
    .setProperty('dscc.username', username)
    .setProperty('dscc.password', password);
};

Теперь у вас есть действительные имя пользователя и пароль, хранящиеся в UserProperties , которые вы можете отправлять на конечную точку REST всякий раз, когда Data Studio вызывает getData () . Например, вот так:

function getData(request) {
  const usernameAndPassword = loadUsernameAndPassword();

  var rawResponse = UrlFetchApp.fetch('path/to/your/data/endpoint?foo=bar', {
    method: 'GET',
    headers: {
      'Authorization': 'Basic ' + Utilities.base64Encode(usernameAndPassword.username + ':' + usernameAndPassword.password)
    }
  });

  // transform your rawResponse ...
}

Теперь, есть проблема с этим подходом, которая не может быть решена прямо сейчас. UserProperties не будет очищено никогда. Таким образом, теоретически, без взлома, комбинация имени пользователя и пароля, однажды набранная и проверенная пользователем и сохраненная в UserProperties, существует всегда. Согласно справочнику по API Connector сообщества, мы можем реализовать resetAuth () , где эта информация может быть удалена из UserProperties, но кажется, что resetAuth () в настоящее время никогда не вызывается. Я уже начал обсуждение этой проблемы здесь .


Это также несколько объяснено на https://developers.google.com/datastudio/connector/auth

...