Sử dụng tài khoản dịch vụ

Bạn có thể sử dụng tài khoản dịch vụ trong Trình kết nối cộng đồng để quản lý quyền truy cập tài nguyên. Một trường hợp sử dụng phổ biến là uỷ quyền truy cập vào mà người dùng không thể truy cập bằng thông tin đăng nhập của riêng họ.

Xem bài viết Tìm hiểu về tài khoản dịch vụ để làm quen với chủ đề này.

Lợi ích

  • Bạn có thể hợp nhất thông tin thanh toán để truy cập vào dữ liệu.
  • Bạn có thể triển khai lớp kiểm soát truy cập của riêng mình trong trình kết nối.
  • Bạn có thể uỷ quyền truy cập vào dữ liệu hoặc tài nguyên mà thông tin xác thực của người dùng không có quyền truy cập vào.

Các bước triển khai

  1. Tạo tài khoản dịch vụ cho nền tảng mà bạn đang tìm nạp dữ liệu.
  2. Cấp các quyền cần thiết cho tài khoản dịch vụ để tài khoản dịch vụ có thể truy cập các tài nguyên cần thiết.
  3. Lưu trữ thông tin đăng nhập của tài khoản dịch vụ trong tập lệnh của trình kết nối các thuộc tính.
  4. Trong quá trình thực thi trình kết nối, hãy sử dụng thông tin đăng nhập đã lưu trữ để tìm nạp thông tin cần thiết .
  5. Không bắt buộc: Triển khai logic kiểm soát quyền truy cập để lọc dữ liệu.

Ví dụ: Truy cập vào BigQuery bằng các Dịch vụ nâng cao của Looker Studio và tài khoản dịch vụ

Bạn đang xây dựng một giải pháp trong đó người dùng sẽ xây dựng trang tổng quan từ Bảng BigQuery. Nếu người dùng sử dụng trình kết nối BigQuery của Looker Studio, họ sẽ cần quyền đọc bảng BigQuery. Họ cũng sẽ yêu cầu một tài khoản thanh toán dành cho Google Cloud Platform (GCP). Các bước sau đây minh hoạ cách sử dụng tài khoản dịch vụ của Google để tổng hợp thông tin thanh toán và uỷ quyền truy cập vào dữ liệu BigQuery.

  1. Tạo một tài khoản dịch vụ trong dự án GCP mà bạn muốn.
  2. Đảm bảo tài khoản dịch vụ có thể tạo công việc trong BigQuery và xem dữ liệu bảng bắt buộc. Xem Kiểm soát quyền truy cập vào BigQuery để biết chi tiết.
  3. Tạo khoá cho tài khoản dịch vụ và lưu trữ thông tin xác thực trong thuộc tính tập lệnh của trình kết nối.
  4. Thêm thư viện Tập lệnh ứng dụng OAuth2 vào Dự án Apps Script.
  5. Đối với hàm getData, hãy xác thực tài khoản dịch vụ và tạo mã truy cập. Đặt phạm vi của OAuth2 thành https://www.googleapis.com/auth/bigquery.readonly.
  6. Trả về mã truy cập cùng các mục cấu hình khác trong phản hồi 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();
}