我在为我的datastudio连接器设置“ USER_PASS”类型的身份验证时遇到了一些麻烦,并且很难找到足够的示例(官方文档仅提供了部分图片)。以前有人设置过吗,请您与我分享您如何配置它?如果有人有示例链接,将对您有很大帮助,谢谢!
答案 0 :(得分:3)
哦,我怎么知道并分享找到适当示例的痛苦。.@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(),该信息可以从UserProperty中删除,但似乎resetAuth()从未被调用过。我已经开始讨论该问题here。