Authentication

コミュニティ コネクタでは、次の認証方法がサポートされています。

  • OAuth 2.0
  • パス/ユーザー名/パスワード
  • パス/キー
  • ユーザー名とパスワード
  • ユーザー名とトークン
  • キー
  • なし

使用する方法に応じて、コネクタに追加の関数を指定する必要があります。

次の表は、コネクタのそれぞれの認証タイプで定義する必要のある関数を示しています。

OAUTH2 PATH_USER_PASS
PATH_KEY
USER_PASS
USER_TOKEN
KEY
なし
getAuthType() 必須 必須 必須
resetAuth() 必須 必須
isAuthValid() 必須 必須
authCallback() 必須
get3PAuthorizationUrls() 必須
setCredentials() 必須

getAuthType()

この関数は、コネクタの認証タイプを返します。

OAUTH2

data-studio/auth.gs
/**
 * Returns the Auth Type of this connector.
 * @return {object} The Auth type.
 */
function getAuthTypeOAuth2() {
  const cc = DataStudioApp.createCommunityConnector();
  return cc.newAuthTypeResponse().setAuthType(cc.AuthType.OAUTH2).build();
}

PATH_USER_PASS

/**
 * Returns the Auth Type of this connector.
 * @return {object} The Auth type.
 */
function getAuthType() {
  var cc = DataStudioApp.createCommunityConnector();
  return cc.newAuthTypeResponse()
    .setAuthType(cc.AuthType.PATH_USER_PASS)
    .setHelpUrl('https://www.example.org/connector-auth-help')
    .build();
}

PATH_KEY

/**
 * Returns the Auth Type of this connector.
 * @return {object} The Auth type.
 */
function getAuthType() {
  var cc = DataStudioApp.createCommunityConnector();
  return cc.newAuthTypeResponse()
    .setAuthType(cc.AuthType.PATH_KEY)
    .setHelpUrl('https://www.example.org/connector-auth-help')
    .build();
}

USER_PASS

data-studio/auth.gs
/**
 * Returns the Auth Type of this connector.
 * @return {object} The Auth type.
 */
function getAuthTypeUserPass() {
  const cc = DataStudioApp.createCommunityConnector();
  return cc
    .newAuthTypeResponse()
    .setAuthType(cc.AuthType.USER_PASS)
    .setHelpUrl("https://www.example.org/connector-auth-help")
    .build();
}

USER_TOKEN

data-studio/auth.gs
/**
 * Returns the Auth Type of this connector.
 * @return {object} The Auth type.
 */
function getAuthTypeUserToken() {
  const cc = DataStudioApp.createCommunityConnector();
  return cc
    .newAuthTypeResponse()
    .setAuthType(cc.AuthType.USER_TOKEN)
    .setHelpUrl("https://www.example.org/connector-auth-help")
    .build();
}

重要な

data-studio/auth.gs
/**
 * Returns the Auth Type of this connector.
 * @return {object} The Auth type.
 */
function getAuthTypeKey() {
  const cc = DataStudioApp.createCommunityConnector();
  return cc
    .newAuthTypeResponse()
    .setAuthType(cc.AuthType.KEY)
    .setHelpUrl("https://www.example.org/connector-auth-help")
    .build();
}

なし

data-studio/auth.gs
/**
 * Returns the Auth Type of this connector.
 * @return {object} The Auth type.
 */
function getAuthTypeNone() {
  const cc = DataStudioApp.createCommunityConnector();
  return cc.newAuthTypeResponse().setAuthType(cc.AuthType.NONE).build();
}

resetAuth()

この関数は、サードパーティ サービスのユーザー用に格納されている認証情報をすべて消去します。

OAUTH2

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

PATH_USER_PASS

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

PATH_KEY

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

USER_PASS

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

USER_TOKEN

data-studio/auth.gs
/**
 * Resets the auth service.
 */
function resetAuthUserToken() {
  const userTokenProperties = PropertiesService.getUserProperties();
  userTokenProperties.deleteProperty("dscc.username");
  userTokenProperties.deleteProperty("dscc.password");
}

重要な

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

isAuthValid()

この関数は、サードパーティ サービスの認証が有効かどうかを確認するために呼び出されます。認証が有効な場合は、不正アクセスが原因で getData() および getSchema() の呼び出しが失敗することはないと想定できます。認証が有効でない場合は、状況に応じて、承認フローを開始するための通知がユーザーに送信されます。

OAUTH2

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

PATH_USER_PASS

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

PATH_KEY

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

USER_PASS

data-studio/auth.gs
/**
 * Returns true if the auth service has access.
 * @return {boolean} True if the auth service has access.
 */
function isAuthValidUserPass() {
  const userProperties = PropertiesService.getUserProperties();
  const userName = userProperties.getProperty("dscc.username");
  const 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 isAuthValidUserToken() {
  const userProperties = PropertiesService.getUserProperties();
  const userName = userProperties.getProperty("dscc.username");
  const 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);
}

重要な

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

OAUTH2

OAuth2 for Apps Script ライブラリを追加および設定する

OAuth2 for Apps Script ライブラリの設定手順に沿って、このライブラリをコネクタ プロジェクトに追加します。次に、使用ガイドの最初の手順を行って、コネクタ プロジェクトに OAuth2 サービスを作成します。OAuth2 サービスには有効な関数名を自由に付けることができますが、コード内で OAuth2 サービスを参照している間は同一の名前を使用してください。

OAuth2 サービスの例(名前は exampleService):

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

authCallback()

この関数は OAuth 2.0 フローを完了するために呼び出されます。サードパーティの認証サービスからのコールバック レスポンスは引数として提供されるため、この関数で処理する必要があります。

OAuth2 for Apps Script ライブラリを使用して OAuth 2.0 コールバックを処理する例:

data-studio/auth.gs
/**
 * The OAuth callback.
 * @param {object} request The request data received from the OAuth flow.
 * @return {HtmlOutput} The HTML output to show to the user.
 */
function authCallback(request) {
  const authorized = getOAuthService().handleCallback(request);
  if (authorized) {
    return HtmlService.createHtmlOutput("Success! You can close this tab.");
  }
  return HtmlService.createHtmlOutput("Denied. You can close this tab");
}

get3PAuthorizationUrls()

この関数は、サードパーティ サービスの認証フローを開始するために必要な URL を取得するために呼び出されます。isAuthValidfalse を返すと、返される URL はユーザーがサードパーティ サービスへのアクセスを承認できるように、ボタンまたはリンクとしてユーザーに表示されます。get3PAuthorizationUrls() について詳しくは、リファレンスをご覧ください。

OAuth2 for Apps Script ライブラリを使用して承認 URL を返す例:

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 さん、KEY さん、PATH_USER_PASS さん、PATH_KEY さん

以下の関数は、USER_PASSUSER_TOKENKEYPATH_USER_PASSPATH_KEY の認証フローでのみ必要とされる関数です。

setCredentials()

setCredentials は、ユーザーがコミュニティ コネクタ設定ページに認証情報を入力した後に呼び出されます。UserProperties を使用してユーザー単位で認証情報を保存するには、Properties サービスを使用する必要があります。

PATH_USER_PASS

/**
 * Sets the credentials.
 * @param {Request} request The set credentials request.
 * @return {object} An object with an errorCode.
 */
function setCredentials(request) {
  var creds = request.pathUserPass;
  var path = creds.path;
  var username = creds.username;
  var password = creds.password;

  // Optional
  // Check if the provided path, 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(path, username, password);
  if (!validCreds) {
    return {
      errorCode: 'INVALID_CREDENTIALS'
    };
  }
  var userProperties = PropertiesService.getUserProperties();
  userProperties.setProperty('dscc.path', path);
  userProperties.setProperty('dscc.username', username);
  userProperties.setProperty('dscc.password', password);
  return {
    errorCode: 'NONE'
  };
}

PATH_KEY

/**
 * Sets the credentials.
 * @param {Request} request The set credentials request.
 * @return {object} An object with an errorCode.
 */
function setCredentials(request) {
  var creds = request.pathKey;
  var path = creds.path;
  var key = creds.key;

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

USER_PASS

data-studio/auth.gs
/**
 * Sets the credentials.
 * @param {Request} request The set credentials request.
 * @return {object} An object with an errorCode.
 */
function setCredentialsUserPass(request) {
  const creds = request.userPass;
  const username = creds.username;
  const 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.
  const validCreds = checkForValidCreds(username, password);
  if (!validCreds) {
    return {
      errorCode: "INVALID_CREDENTIALS",
    };
  }
  const 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 setCredentialsUserToken(request) {
  const creds = request.userToken;
  const username = creds.username;
  const 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.
  const validCreds = checkForValidCreds(username, token);
  if (!validCreds) {
    return {
      errorCode: "INVALID_CREDENTIALS",
    };
  }
  const userProperties = PropertiesService.getUserProperties();
  userProperties.setProperty("dscc.username", username);
  userProperties.setProperty("dscc.token", token);
  return {
    errorCode: "NONE",
  };
}

重要な

data-studio/auth.gs
/**
 * Sets the credentials.
 * @param {Request} request The set credentials request.
 * @return {object} An object with an errorCode.
 */
function setCredentialsKey(request) {
  const 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.
  const validKey = checkForValidKey(key);
  if (!validKey) {
    return {
      errorCode: "INVALID_CREDENTIALS",
    };
  }
  const userProperties = PropertiesService.getUserProperties();
  userProperties.setProperty("dscc.key", key);
  return {
    errorCode: "NONE",
  };
}