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