שימוש בחשבון שירות

אפשר להשתמש בחשבונות שירות במחברים של הקהילה כדי לנהל ניהול הגישה למשאבים. תרחיש נפוץ לדוגמה הוא להעניק גישה אל נתונים שמשתמשים לא יוכלו לגשת אליהם באמצעות פרטי הכניסה שלהם.

במאמר הסבר על חשבונות שירות אפשר להכיר את הנושא.

יתרונות

  • אפשר לאחד חיובים עבור גישה לנתונים.
  • אפשר להטמיע שכבת בקרת גישה משלכם במחבר.
  • יש לך אפשרות להעניק גישה לנתונים או למשאבים שהגישה אליהם קשורה לפרטי הכניסה של המשתמש ל- אין גישה אל.

שלבי ההטמעה

  1. יוצרים חשבון שירות לפלטפורמה שממנה שולפים נתונים.
  2. צריך לתת לחשבון השירות את ההרשאות הנדרשות כדי שתהיה לו גישה את המשאבים הנדרשים.
  3. אחסון פרטי הכניסה של חשבון השירות בסקריפט של המחבר נכסים.
  4. במהלך ביצוע המחבר, יש להשתמש בפרטי הכניסה המאוחסנים לצורך אחזור הנדרש .
  5. אופציונלי: מטמיעים לוגיקה של בקרת גישה לסינון הנתונים.

דוגמה: גישה ל-BigQuery באמצעות השירותים המתקדמים של Looker Studio וחשבון שירות

אתה יוצר פתרון שבו המשתמשים שלך יבנו מרכזי שליטה טבלה ב-BigQuery. אם המשתמשים שלך ישתמשו במחבר BigQuery של Looker Studio, הם יוכלו צריכה גישת קריאה לטבלה ב-BigQuery. יידרש להם גם חשבון לחיוב ל-Google Cloud Platform (GCP). השלבים הבאים ממחישים איך להשתמש כדי לאחד את החיובים ולהעניק גישה לנתוני BigQuery.

  1. יוצרים חשבון שירות בפרויקט GCP הרצוי.
  2. לוודא שחשבון השירות יכול ליצור משימות ב-BigQuery ולראות את הנתונים שלהן את הטבלה הנדרשת. לפרטים נוספים, ראו בקרת גישה ל-BigQuery.
  3. ליצור מפתח לחשבון השירות ולשמור את פרטי הכניסה ב מאפייני הסקריפט של המחבר.
  4. כוללים את ספריית OAuth2 Apps Script ב- פרויקט Apps Script.
  5. בפונקציה getData, מאמתים את חשבון השירות ויוצרים אסימון גישה. הגדרת היקף ההרשאות של OAuth2 https://www.googleapis.com/auth/bigquery.readonly
  6. החזרת אסימון גישה עם פריטי הגדרה אחרים בתגובה 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();
}