你可以在社群連接器中使用服務帳戶, 管理資源存取權一般用途是將存取權委派給 就無法讓他們透過自己的憑證存取的資料。
請參閱「瞭解服務帳戶」一文,熟悉這個主題。
優點
- 您可以整合帳單以存取資料。
- 您可以在連接器中實作自己的存取控制層。
- 您可以將使用者憑證的資料或資源存取權委派給他人 無法存取。
導入步驟
- 為您要擷取資料的平台建立服務帳戶。
- 為服務帳戶提供必要權限,讓服務帳戶能夠存取 所需資源
- 將服務帳戶的憑證儲存在連接器指令碼中 資源。
- 在連接器執行期間,使用已儲存的憑證擷取必要憑證 資料。
- 選用:實作存取權控管邏輯來篩選資料。
範例:透過 Looker Studio 進階服務和服務帳戶存取 BigQuery
您正在建構一個解決方案,讓使用者能從 BigQuery 資料表。如果使用者使用 Looker Studio 的 BigQuery 連接器, 必須授予 BigQuery 資料表的讀取權限。此外,也需要有帳單帳戶 。下列步驟示範如何使用 服務帳戶,合併帳單並委派 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();
}