哦,我是如何知道并分享找到足够示例的痛苦的。@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也有一些解释