您可以在社区连接器中使用服务账号来集中管理资源的访问权限。一个常见的使用情形是授予对用户使用自己的凭据无法访问的数据的访问权限。
请参阅了解服务账号,熟悉一下该主题。
优势
- 您可以针对数据访问合并结算。
- 您可以在连接器中实现自己的访问控制层。
- 您可以授予对用户凭据中的数据或资源的访问权限, 没有访问权限。
实现步骤
- 为您要从中提取数据的平台创建服务账号。
- 为服务账号提供必要的权限,以便它可以访问所需的资源。
- 将服务账号的凭据存储在连接器的脚本属性中。
- 在连接器执行期间,使用存储的凭据提取所需的 数据。
- 可选:实现访问控制逻辑以过滤数据。
示例:使用 Looker Studio 高级服务和服务账号访问 BigQuery
您正在构建一个解决方案,以供您的用户根据 BigQuery 表格构建信息中心。如果您的用户使用 Looker Studio 的 BigQuery 连接器,他们将 需要 BigQuery 表的读取权限。此外,他们还需要一个 Google Cloud Platform (GCP) 结算账号。以下步骤说明了如何使用 服务账号来合并结算并授予对 BigQuery 数据的访问权限。
- 在所需的 GCP 项目中创建一个服务账号。
- 确保服务账号可以创建 BigQuery 作业并查看 所需的表格如需了解详情,请参阅 BigQuery 访问控制。
- 为服务账号创建密钥,并将凭据存储在 脚本属性。
- 将OAuth2 Apps 脚本库添加到您的 Apps 脚本项目。
- 对于您的
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();
}