يمكنك استخدام حسابات الخدمة في "وصلات المنتدى" للإدارة المركزية للوصول إلى الموارد. تتمثل إحدى حالات الاستخدام الشائعة في تفويض الوصول إلى
البيانات التي لن يتمكن المستخدمون من الوصول إليها باستخدام بيانات الاعتماد الخاصة بهم.
راجِع مقالة فهم حسابات الخدمة للتعرّف على الموضوع.
المزايا
يمكنك توحيد الفوترة للوصول إلى البيانات.
يمكنك تنفيذ طبقة التحكم في الوصول الخاصة بك في الموصِّل.
يمكنك تفويض الوصول إلى البيانات أو الموارد التي لا يمكن لبيانات اعتماد المستخدم
الوصول إليها.
خطوات التنفيذ
أنشِئ حساب خدمة على النظام الأساسي الذي تجلب البيانات منه.
امنح الأذونات اللازمة لحساب الخدمة حتى يتمكن من الوصول إلى الموارد المطلوبة.
خزِّن بيانات اعتماد حساب الخدمة في مواقع النص البرمجي
للموصِّل.
أثناء تنفيذ الموصل، استخدم بيانات الاعتماد المخزنة لجلب البيانات المطلوبة.
اختياري : يمكنك تنفيذ منطق التحكّم في الوصول لفلترة البيانات.
تنبيه: لا تخزِّن بيانات اعتماد حساب الخدمة في الرمز. وبدلاً من ذلك، يمكنك استخدام خصائص النص البرمجي للموصل لضمان عدم تمكُّن المستخدمين الآخرين الذين لديهم حق الوصول للعرض إلى الرمز (إما من خلال برمجة التطبيقات أو مستودع الرموز الخارجية) من رؤية بيانات الاعتماد.
مثال: الوصول إلى BigQuery باستخدام "الخدمات المتقدمة في Looker Studio" وحساب الخدمة
أنت تبني حلاً يمكن للمستخدمين من خلاله إنشاء لوحات بيانات من
جدول BigQuery. إذا كان المستخدمون يستخدمون موصل BigQuery في Looker Studio، سيحتاجون إلى
إذن الوصول للقراءة إلى جدول BigQuery. سيُطلب منهم أيضًا حساب فوترة
لخدمة Google Cloud Platform (GCP). توضّح الخطوات التالية كيفية استخدام حساب خدمة
لدمج الفوترة وتفويض الوصول إلى بيانات BigQuery.
أنشِئ حساب خدمة في مشروع Google Cloud Platform المطلوب.
تأكَّد من أنّ حساب الخدمة يمكنه إنشاء مهام BigQuery والاطّلاع على البيانات
للجدول المطلوب. اطّلِع على التحكّم في الوصول إلى BigQuery لمعرفة التفاصيل.
أنشئ مفتاحًا لحساب الخدمة وخزِّن بيانات الاعتماد في سمات النص البرمجي للموصل.
يمكنك تضمين مكتبة برمجة تطبيقات OAuth2 في مشروع "برمجة تطبيقات Google".
بالنسبة إلى وظيفة 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();
}