중앙 집중식을 위한 커뮤니티 커넥터의 서비스 계정을 리소스 액세스 관리입니다 일반적인 사용 사례는 사용자가 자신의 사용자 인증 정보로는 액세스할 수 없는 데이터에 대한 액세스를 허용할 수 있습니다
서비스 계정 이해를 검토하여 주제를 숙지합니다.
이점
- 데이터 액세스를 위해 결제를 통합할 수 있습니다.
- 커넥터에 자체 액세스 제어 레이어를 구현할 수 있습니다.
- 자신의 사용자 인증 정보가 포함된 데이터 또는 리소스에 대한 액세스 권한을 님은 액세스 권한이 없습니다.
구현 단계
- 데이터를 가져올 플랫폼의 서비스 계정을 만듭니다.
- 서비스 계정에서 액세스할 수 있도록 필요한 권한 제공 리소스를 배포합니다
- 커넥터의 스크립트에 서비스 계정의 사용자 인증 정보 저장 속성
- 커넥터 실행 중에 저장된 사용자 인증 정보를 사용하여 필요한 항목을 가져옵니다. 데이터를 수집하는 데 사용됩니다
- 선택사항: 액세스 제어 로직을 구현하여 데이터를 필터링합니다.
예: Looker Studio 고급 서비스 및 서비스 계정으로 BigQuery 액세스
사용자가 Google Cloud 콘솔에서 대시보드를 빌드하는 BigQuery 테이블 사용자가 Looker Studio의 BigQuery 커넥터를 사용하는 경우 BigQuery 테이블에 대한 읽기 액세스 권한이 필요합니다. 결제 계정도 필요합니다. (Google Cloud Platform(GCP))에 대해 알아봅니다 다음 단계는 서비스 계정을 사용하여 결제를 통합하고 BigQuery 데이터에 대한 액세스 권한을 위임할 수 있습니다.
- 원하는 GCP 프로젝트에서 서비스 계정을 만듭니다.
- 서비스 계정이 BigQuery 작업을 만들고 다음 기간의 데이터를 볼 수 있는지 확인하세요. 필수 테이블입니다. 자세한 내용은 BigQuery 액세스 제어를 참조하세요.
- 서비스 계정의 키를 만들고 사용자 인증 정보를 커넥터의 스크립트 속성을 참조하세요.
- OAuth2 Apps Script 라이브러리를 Apps Script 프로젝트.
getData
함수의 경우 서비스 계정을 인증하고 액세스할 수 있습니다 OAuth2 범위를 다음으로 설정https://www.googleapis.com/auth/bigquery.readonly
getData
응답에서 다른 구성 항목과 함께 액세스 토큰을 반환합니다.
다음은 커넥터 코드의 전체 예입니다.
기본.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();
}