【问题标题】:Using "USER_PASS" with datastudio connector将“USER_PASS”与 datastudio 连接器一起使用
【发布时间】:2018-11-09 06:13:48
【问题描述】:

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

【问题讨论】:

  • 我遇到的主要问题是,一旦我提交了身份验证,代码就可以工作(基于日志),但我仍然收到“很抱歉我们未能提交您的凭据,因为未知错误”消息。有没有其他人经历过这个? KEY 身份验证也是如此。
  • 这个kaggle connector用户USER_PASS。这有帮助吗?

标签: javascript google-data-studio


【解决方案1】:

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


基本上,您将需要组合的东西。第一个是实现getAuthType() 告诉Data Studio 它可能需要显示这样的掩码:

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

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

但如果返回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(),其中可以从 UserProperties 中删除此信息,但似乎 resetAuth() 目前从未被调用过。我已经开始讨论这个问题here


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

【讨论】:

  • 英雄!找了好几个星期,这就是解决方案!
猜你喜欢
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多