О, как я знаю и разделяю боль от нахождения адекватных примеров ... соединитель kaggle , упомянутый @diminishedprime, на самом деле тоже использует то, что мне показалось работающим. Вот сокращенный пример, который, я надеюсь, будет полезен для вас.
В основном вам понадобится комбинация вещей. Первым было бы реализовать getAuthType () , чтобы сообщить Data Studio, что может потребоваться отобразить такую маску:
function getAuthType() {
return {
type: 'USER_PASS'
};
};
Тогда, поскольку вы используете USER_PASS
, Data Studio вызывает isAuthValid () и ожидает, что он вернет Boolean
. Всякий раз, когда вы находитесь на первой странице конфигурации для источника данных, который использует ваш соединитель, эта функция вызывается. Если он вернет false
, будет показана маска, подобная этой:
USER_PASS">
Но если он вернет true
, этот шаг будет перепрыгнут.
Но в чем логика, спросите вы? Я сам и соединитель kaggle использую 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()
объясняется ниже.
Когда пользователь вводит свое имя пользователя / пароль и нажимает кнопку Send (я полагаю, это называется на английском языке), 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()
фактически отправляет учетные данные конечной точке REST, используя UrlFetchApp :
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 , которые вы можете отправлять на конечную точку REST всякий раз, когда Data Studio вызывает getData () . Например, вот так:
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 Connector сообщества, мы можем реализовать resetAuth () , где эта информация может быть удалена из UserProperties, но кажется, что resetAuth () в настоящее время никогда не вызывается. Я уже начал обсуждение этой проблемы здесь .
Это также несколько объяснено на https://developers.google.com/datastudio/connector/auth