תוכלו להשתמש בחשבונות שירות ב- Community Connectors כדי לנהל את הגישה למשאבים באופן מרוכז. תרחיש נפוץ לדוגמה הוא הענקת גישה לנתונים שמשתמשים לא יכולים לגשת אליהם באמצעות פרטי הכניסה שלהם.
כדי להכיר את הנושא, כדאי לעיין במאמר עבודה עם חשבון שירות .
יתרונות
אפשר לאחד את החיוב על גישה לנתונים.
אפשר להטמיע שכבת בקרת גישה משלך במחבר.
אפשר להעניק גישה לנתונים או למשאבים שלפרטי הכניסה של המשתמש אין גישה אליהם.
שלבי ההטמעה
יוצרים חשבון שירות לפלטפורמה שממנה מאחזרים נתונים.
נותנים לחשבון השירות את ההרשאות הנדרשות כדי לקבל גישה למשאבים הנדרשים.
אחסנו את פרטי הכניסה של חשבון השירות במאפייני הסקריפט של המחבר.
במהלך הפעלת המחבר, משתמשים בפרטי הכניסה המאוחסנים כדי לאחזר את הנתונים הנדרשים.
אופציונלי : מטמיעים לוגיקה של בקרת גישה כדי לסנן את הנתונים.
זהירות: אין לשמור בקוד את פרטי הכניסה של חשבון השירות. במקום זאת, כדאי להשתמש במאפייני הסקריפט של המחבר כדי לוודא שמשתמשים אחרים שיש להם גישת צפייה לקוד (דרך Apps Script או דרך מאגר קודים חיצוני) לא יכולים לראות את פרטי הכניסה.
דוגמה: גישה ל-BigQuery באמצעות Looker Studio Advanced Services וחשבון שירות
אתם מפתחים פתרון שלפיו המשתמשים יבנו מרכזי בקרה מטבלה של BigQuery. אם המשתמשים שלכם משתמשים במחבר BigQuery של Looker Studio, הם יצטרכו גישת קריאה לטבלת BigQuery. הם גם ידרשו חשבון לחיוב ב-Google Cloud Platform (GCP). בשלבים הבאים מוסבר איך להשתמש בחשבון שירות כדי לאחד את החיובים ולהאציל את הגישה לנתוני BigQuery.
יוצרים חשבון שירות בפרויקט GCP הרצוי.
מוודאים שבחשבון השירות אפשר ליצור משימות ב-BigQuery ולהציג את הנתונים של הטבלה הנדרשת. פרטים נוספים זמינים במאמר בקרת גישה ל-BigQuery .
יוצרים מפתח לחשבון השירות ושומרים את פרטי הכניסה במאפייני הסקריפט של המחבר.
כוללים את ספריית OAuth2 Apps Script בפרויקט Apps Script.
צריך לאמת את חשבון השירות וליצור אסימון גישה לפונקציה getData
. מגדירים את היקף OAuth2 כ-https://www.googleapis.com/auth/bigquery.readonly
.
החזרת אסימון גישה עם פריטי תצורה אחרים בתגובה getData
.
זוהי דוגמה מלאה לקוד המחבר:
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();
}