使用带有 datastudio 连接器的“USER_PASS”

Log*_*phy 4 javascript google-data-studio

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

Gre*_*ier 9

哦,我是如何知道并分享找到足够例子的痛苦的。@diminishedprime提到的kaggle 连接器实际上也在使用我发现的工作。这是一个删节的例子,我希望对你有帮助。


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

function getAuthType() {      
  return {
    type: 'USER_PASS'
  };
};
Run Code Online (Sandbox Code Playgroud)

然后,因为您使用的是USER_PASS,Data Studio 会调用isAuthValid()并期望它返回一个Boolean. 每次您处于使用连接器的数据源配置的第一页时,都会调用此函数。如果它返回false,将显示这样的掩码:

使用 <code>USER_PASS</code> 进行身份验证

但是如果返回true,则跳过这一步。

但你可能会问,这背后的逻辑是什么?我自己和kaggle 连接器正在使用UserProperties来保留使用此数据源的用户名/密码。您可以检查是否存在正确的凭据并通过您的 REST 端点对其进行身份验证,然后Boolean根据此返回您的凭据。它可能看起来像这样:

function isAuthValid() {
  const usernameAndPassword = loadUsernameAndPassword();
  return usernameAndPassword.username && usernameAndPassword.password && validateCredentials(usernameAndPassword.username, usernameAndPassword.password)
};
Run Code Online (Sandbox Code Playgroud)

loadCurrentUsernameAndPassword()只需从UserProperties加载它们:

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

validateCredentials() 下面进一步解释。


当用户输入他的用户名/密码并单击Send -Button(我假设这就是它的英文名称)时,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"
    };
  }
};
Run Code Online (Sandbox Code Playgroud)

如您所见,我引入了 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;
}
Run Code Online (Sandbox Code Playgroud)

第二个新函数storeUsernameAndPassword()将用户名/密码存储到UserProperties 中

function storeUsernameAndPassword(username, password) {
  PropertiesService
    .getUserProperties()
    .setProperty('dscc.username', username)
    .setProperty('dscc.password', password);
};
Run Code Online (Sandbox Code Playgroud)

现在您在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 ...
}
Run Code Online (Sandbox Code Playgroud)

现在,这种方法存在一个问题,目前无法解决。该UserProperties不会被永远清除。因此,理论上,无需破解,用户名/密码组合,一旦由用户键入并验证并存储到 UserProperties 中,就会永远存在。根据社区连接器 API 参考,我们可以实现resetAuth(),其中可以从 UserProperties 中删除此信息,但似乎 resetAuth() 目前从未被调用过。我已经在这里开始讨论这个问题。


https://developers.google.com/datastudio/connector/auth也有一些解释