将“ USER_PASS”与datastudio连接器一起使用

时间:2018-11-05 02:11:48

标签: javascript google-data-studio

我在为我的datastudio连接器设置“ USER_PASS”类型的身份验证时遇到了一些麻烦,并且很难找到足够的示例(官方文档仅提供了部分图片)。以前有人设置过吗,请您与我分享您如何配置它?如果有人有示例链接,将对您有很大帮助,谢谢!

1 个答案:

答案 0 :(得分:3)

哦,我怎么知道并分享找到适当示例的痛苦。.@diminishedprime提到的kaggle connector实际上也在使用我发现有效的方法。这是一个简短的示例,希望对您有所帮助。


基本上,您将需要综合考虑。第一种是实现getAuthType()来告诉Data Studio它可能需要显示这样的掩码:

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

然后,因为您使用的是USER_PASS,所以Data Studio会调用isAuthValid(),并期望它返回Boolean。每当您在使用连接器的数据源的配置的第一页上时,都会调用此函数。如果返回false,将显示如下掩码:

Authenticate using <code>USER_PASS</code>

但是,如果返回true,则将跳过此步骤。

但是,您可能会问这背后的逻辑是什么?我本人和kaggle connector都在使用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()在下面进行了解释。


当用户键入用户名/密码并单击发送-按钮(我假设这是英文名称)时,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()实际上使用UrlFetchApp将凭据发送到REST端点:

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中存储了有效的用户名和密码,只要Data Studio调用getData(),您就可以将其发送到REST端点。例如这样的

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参考,我们可以实现resetAuth(),该信息可以从UserProperty中删除,但似乎resetAuth()从未被调用过。我已经开始讨论该问题here


https://developers.google.com/datastudio/connector/auth

中也有一些解释。