Autenticación

Hay cinco métodos de autenticación admitidos:

  • OAuth 2.0
  • Nombre de usuario y contraseña (USER_PASS)
  • Nombre de usuario y token (USER_TOKEN)
  • Clave (KEY)
  • Nada (NONE)

Dependiendo del método que se use, debes proporcionar funciones adicionales en tu conector.

La siguiente tabla indica qué funciones debes definir según el tipo de autenticación del conector.

OAUTH2 USER_PASS/USER_TOKEN/KEY NONE
getAuthType() Obligatoria Obligatoria Obligatoria
resetAuth() Obligatoria Obligatoria
isAuthValid() Obligatoria Obligatoria
authCallback() Obligatoria
get3PAuthorizationUrls() Obligatoria
setCredentials() Obligatoria

getAuthType()

Esta función debe devolver el tipo de autenticación del conector.

OAUTH2

data-studio/auth.gs
/**
 * Gets the OAuth2 Auth type.
 * @return {object} The Auth type.
 */
function getAuthType() {
  return {
    type: 'OAUTH2'
  };
}

USER_PASS

data-studio/auth.gs
/**
 * Gets the OAuth2 Auth type.
 * @return {object} The Auth type.
 */
function getAuthType() {
  return {
    type: 'USER_PASS',
    helpUrl: 'https://www.example.org/connector-auth-help'
  };
}

USER_TOKEN

data-studio/auth.gs
/**
 * Gets the OAuth2 Auth type.
 * @return {object} The Auth type.
 */
function getAuthType() {
  return {
    type: 'USER_TOKEN',
    helpUrl: 'https://www.example.org/connector-auth-help'
  };
}

KEY

data-studio/auth.gs
/**
 * Gets the OAuth2 Auth type.
 * @return {object} The Auth type.
 */
function getAuthType() {
  return {
    type: 'KEY',
    helpUrl: 'https://www.example.org/connector-auth-help'
  };
}

NONE

data-studio/auth.gs
/**
 * Gets the OAuth2 Auth type.
 * @return {object} The Auth type.
 */
function getAuthType() {
  return {
    type: 'NONE'
  };
}

resetAuth()

Esta función borrará las credenciales de los usuarios almacenadas para los servicios de terceros.

OAUTH2

data-studio/auth.gs
/**
 * Resets the auth service.
 */
function resetAuth() {
  getOAuthService().reset();
}

USER_PASS

data-studio/auth.gs
/**
 * Resets the auth service.
 */
function resetAuth() {
  var userProperties = PropertiesService.getUserProperties();
  userProperties.deleteProperty('dscc.username');
  userProperties.deleteProperty('dscc.password');
}

USER_TOKEN

data-studio/auth.gs
/**
 * Resets the auth service.
 */
function resetAuth() {
  var user_tokenProperties = PropertiesService.getUserProperties();
  user_tokenProperties.deleteProperty('dscc.username');
  user_tokenProperties.deleteProperty('dscc.password');
}

KEY

data-studio/auth.gs
/**
 * Resets the auth service.
 */
function resetAuth() {
  var userProperties = PropertiesService.getUserProperties();
  userProperties.deleteProperty('dscc.key');
}

isAuthValid()

Se llama a esta función para determinar si la autenticación del servicio de terceros es válida. Si la autenticación es válida, las llamadas a getData() y getSchema() no deberían generar errores por acceso no autorizado. Si la autenticación no es válida, los usuarios podrían recibir una notificación indicándoles que inicien el proceso de autorización.

OAUTH2

data-studio/auth.gs
/**
 * Returns true if the auth service has access.
 * @return {boolean} True if the auth service has access.
 */
function isAuthValid() {
  return getOAuthService().hasAccess();
}

USER_PASS

data-studio/auth.gs
/**
 * Returns true if the auth service has access.
 * @return {boolean} True if the auth service has access.
 */
function isAuthValid() {
  var userProperties = PropertiesService.getUserProperties();
  var userName = userProperties.getProperty('dscc.username');
  var password = userProperties.getProperty('dscc.password');
  // This assumes you have a validateCredentials function that
  // can validate if the userName and password are correct.
  return validateCredentials(userName, password);
}

USER_TOKEN

data-studio/auth.gs
/**
 * Returns true if the auth service has access.
 * @return {boolean} True if the auth service has access.
 */
function isAuthValid() {
  var userProperties = PropertiesService.getUserProperties();
  var userName = userProperties.getProperty('dscc.username');
  var token = userProperties.getProperty('dscc.token');
  // This assumes you have a validateCredentials function that
  // can validate if the userName and token are correct.
  return validateCredentials(userName, token);
}

KEY

data-studio/auth.gs
/**
 * Returns true if the auth service has access.
 * @return {boolean} True if the auth service has access.
 */
function isAuthValid() {
  var userProperties = PropertiesService.getUserProperties();
  var key = userProperties.getProperty('dscc.key');
  // This assumes you have a validateKey function that can validate
  // if the key is valid.
  return validateKey(key);
}

OAUTH2

Añadir y configurar OAuth2 para la biblioteca de Apps Script

Si quieres añadir la biblioteca OAuth2 de Apps Script al proyecto del conector, sigue estas instrucciones de configuración. A continuación, sigue el primer paso que aparece en la guía de uso para crear un servicio de OAuth2 en el proyecto del conector. Asigna un nombre de función válido al servicio. Puede ser cualquier nombre, pero recuerda que debes usar el mismo en tu código.

Por ejemplo, el servicio de OAuth2 se podría llamar exampleService:

data-studio/auth.gs
/**
 * Returns the OAuth Service
 * @return {Service} The OAuth Service
 */
function getOAuthService() {
  return OAuth2.createService('exampleService')
    .setAuthorizationBaseUrl('...')
    .setTokenUrl('...')
    .setClientId('...')
    .setClientSecret('...')
    .setPropertyStore(PropertiesService.getUserProperties())
    .setCallbackFunction('authCallback')
    .setScope('...');
};

authCallback()

Se llama a esta función para finalizar el proceso de OAuth 2.0. La respuesta de retrollamada del servicio de autenticación de terceros se proporciona como un argumento y debería gestionarlo esta función.

Ejemplo donde se gestiona la retrollamada de OAuth 2.0 con la biblioteca OAuth2 de Apps Script:

data-studio/auth.gs
/**
 * The OAuth callback.
 * @param {function} request The OAuth service callback handler.
 * @return {HtmlOutput} The HTML output.
 */
function authCallback(request) {
  var authorized = getOAuthService().handleCallback(request);
  if (authorized) {
    return HtmlService.createHtmlOutput('Success! You can close this tab.');
  } else {
    return HtmlService.createHtmlOutput('Denied. You can close this tab');
  };
};

get3PAuthorizationUrls()

Se llama a esta función para obtener las URL necesarias para iniciar el proceso de autenticación de los servicios de terceros. Si isAuthValid devuelve false, las URL devueltas se mostrarán a los usuarios como botones o enlaces, que podrán usar para autorizar el acceso a los servicios. Consulta la referencia de la función get3PAuthorizationUrls().

Ejemplo donde se devuelve la URL de autorización mediante la biblioteca OAuth2 de Apps Script:

data-studio/auth.gs
/**
 * Gets the 3P authorization URL.
 * @return {string} The authorization URL.
 * @see https://developers.google.com/apps-script/reference/script/authorization-info
 */
function get3PAuthorizationUrls() {
  return getOAuthService().getAuthorizationUrl();
}

USER_PASS, USER_TOKEN y KEY

Lo siguiente solo es necesario en los flujos de autenticación USER_PASS, USER_TOKEN y KEY.

setCredentials()

Se llama a setCredentials después de que el usuario introduzca sus credenciales en la página de configuración del conector de la comunidad. Debes usar el Servicio Propiedades para guardar las credenciales de cada usuario utilizando UserProperties.

USER_PASS

data-studio/auth.gs
/**
 * Sets the credentials.
 * @param {Request} request The set credentials request.
 * @return {object} An object with an errorCode.
 */
function setCredentials(request) {
  var creds = request.userPass;
  var username = creds.username;
  var password = creds.password;

  // Optional
  // Check if the provided username and password are valid through a
  // call to your service. You would have to have a `checkForValidCreds`
  // function defined for this to work.
  var validCreds = checkForValidCreds(username, password);
  if (!validCreds) {
    return {
      errorCode: 'INVALID_CREDENTIALS'
    };
  }
  var userProperties = PropertiesService.getUserProperties();
  userProperties.setProperty('dscc.username', username);
  userProperties.setProperty('dscc.password', password);
  return {
    errorCode: 'NONE'
  };
}

USER_TOKEN

data-studio/auth.gs
/**
 * Sets the credentials.
 * @param {Request} request The set credentials request.
 * @return {object} An object with an errorCode.
 */
function setCredentials(request) {
  var creds = request.userToken;
  var username = creds.username;
  var token = creds.token;

  // Optional
  // Check if the provided username and token are valid through a
  // call to your service. You would have to have a `checkForValidCreds`
  // function defined for this to work.
  var validCreds = checkForValidCreds(username, token);
  if (!validCreds) {
    return {
      errorCode: 'INVALID_CREDENTIALS'
    };
  }
  var userProperties = PropertiesService.getUserProperties();
  userProperties.setProperty('dscc.username', username);
  userProperties.setProperty('dscc.token', token);
  return {
    errorCode: 'NONE'
  };
}

KEY

data-studio/auth.gs
/**
 * Sets the credentials.
 * @param {Request} request The set credentials request.
 * @return {object} An object with an errorCode.
 */
function setCredentials(request) {
  var key = request.key;

  // Optional
  // Check if the provided key is valid through a call to your service.
  // You would have to have a `checkForValidKey` function defined for
  // this to work.
  var validKey = checkForValidKey(key);
  if (!validKey) {
    return {
      errorCode: 'INVALID_CREDENTIALS'
    };
  }
  var userProperties = PropertiesService.getUserProperties();
  userProperties.setProperty('dscc.key', key);
  return {
    errorCode: 'NONE'
  };
}