Vous pouvez utiliser des comptes de service dans vos connecteurs de communauté de l'accès aux ressources. Un cas d'utilisation courant consisterait à déléguer l'accès à des données auxquelles les utilisateurs ne pourraient pas accéder à l’aide de leurs propres identifiants.
Consultez la page Comprendre les comptes de service pour vous familiariser avec le sujet.
Avantages
- Vous pouvez consolider la facturation pour l'accès aux données.
- Vous pouvez implémenter votre propre couche de contrôle des accès dans votre connecteur.
- Vous pouvez déléguer l'accès aux données ou aux ressources associées aux identifiants de l'utilisateur n'a pas accès.
Étapes de mise en œuvre
- Créez un compte de service pour la plate-forme à partir de laquelle vous récupérez des données.
- Accordez les autorisations nécessaires au compte de service pour qu'il puisse accéder les ressources requises.
- Stockez les identifiants du compte de service dans le script du connecteur. propriétés.
- Pendant l'exécution du connecteur, utilisez les identifiants stockés pour récupérer les ressources données.
- Facultatif: Implémentez une logique de contrôle des accès pour filtrer les données.
Exemple: Accéder à BigQuery avec les services avancés de Looker Studio et un compte de service
Vous développez une solution dans laquelle vos utilisateurs créeront des tableaux de bord à partir d'un table BigQuery. Si vos utilisateurs se servent du connecteur BigQuery de Looker Studio, n'avez pas besoin d'un accès en lecture à la table BigQuery. Ils auront également besoin d'un compte de facturation pour Google Cloud Platform (GCP). Les étapes suivantes expliquent comment utiliser un pour consolider la facturation et déléguer l'accès aux données BigQuery.
- Créez un compte de service dans le projet GCP de votre choix.
- Assurez-vous que le compte de service peut créer des jobs BigQuery et afficher les données pour la table requise. Pour en savoir plus, consultez la page Contrôle des accès dans BigQuery.
- Créez une clé pour le compte de service et stockez les identifiants dans votre propriétés de script du connecteur.
- Incluez la bibliothèque OAuth2 Apps Script dans vos Projet Apps Script.
- Pour votre fonction
getData
, authentifiez le compte de service et générez un jeton d'accès. Définir le champ d'application OAuth2 surhttps://www.googleapis.com/auth/bigquery.readonly
- Renvoyez un jeton d'accès avec d'autres éléments de configuration dans la réponse
getData
.
Voici un exemple complet de code de connecteur:
main.js
var cc = DataStudioApp.createCommunityConnector();
var scriptProperties = PropertiesService.getScriptProperties();
function isAdminUser() {
return true;
}
function getAuthType() {
var AuthTypes = cc.AuthType;
return cc
.newAuthTypeResponse()
.setAuthType(AuthTypes.NONE)
.build();
}
function getConfig(request) {
var config = cc.getConfig();
config
.newInfo()
.setId('generalInfo')
.setText('This is an example connector to showcase row level security.');
return config.build();
}
function getFields() {
var fields = cc.getFields();
var types = cc.FieldType;
var aggregations = cc.AggregationType;
fields
.newDimension()
.setId('region')
.setName('Region')
.setType(types.TEXT);
fields
.newMetric()
.setId('sales')
.setName('Sales')
.setType(types.NUMBER)
.setAggregation(aggregations.SUM);
fields
.newDimension()
.setId('date')
.setName('Date')
.setType(types.YEAR_MONTH_DAY);
return fields;
}
function getSchema(request) {
return {schema: getFields().build()};
}
var SERVICE_ACCOUNT_CREDS = 'SERVICE_ACCOUNT_CREDS';
var SERVICE_ACCOUNT_KEY = 'private_key';
var SERVICE_ACCOUNT_EMAIL = 'client_email';
var BILLING_PROJECT_ID = 'project_id';
/**
* Copy the entire credentials JSON file from creating a service account in GCP.
*/
function getServiceAccountCreds() {
return JSON.parse(scriptProperties.getProperty(SERVICE_ACCOUNT_CREDS));
}
function getOauthService() {
var serviceAccountCreds = getServiceAccountCreds();
var serviceAccountKey = serviceAccountCreds[SERVICE_ACCOUNT_KEY];
var serviceAccountEmail = serviceAccountCreds[SERVICE_ACCOUNT_EMAIL];
return OAuth2.createService('RowLevelSecurity')
.setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
.setTokenUrl('https://accounts.google.com/o/oauth2/token')
.setPrivateKey(serviceAccountKey)
.setIssuer(serviceAccountEmail)
.setPropertyStore(scriptProperties)
.setCache(CacheService.getScriptCache())
.setScope(['https://www.googleapis.com/auth/bigquery.readonly']);
}
var BASE_SQL =
'SELECT d.region, d.sales, d.date ' +
'FROM `datastudio-solutions.row_level_security.data` d ' +
'INNER JOIN `datastudio-solutions.row_level_security.access` a ' +
'ON d.region = a.region ' +
'where a.email=@email';
function getData(request) {
var accessToken = getOauthService().getAccessToken();
var serviceAccountCreds = getServiceAccountCreds();
var billingProjectId = serviceAccountCreds[BILLING_PROJECT_ID];
var email = Session.getEffectiveUser().getEmail();
var bqTypes = DataStudioApp.createCommunityConnector().BigQueryParameterType;
return cc
.newBigQueryConfig()
.setAccessToken(accessToken)
.setBillingProjectId(billingProjectId)
.setUseStandardSql(true)
.setQuery(BASE_SQL)
.addQueryParameter('email', bqTypes.STRING, email)
.build();
}