Kết nối với các dịch vụ của Google Cloud

Bạn có thể sử dụng phương thức ScriptApp.getIdentityToken() để lấy mã thông báo danh tính OpenID Connect (Mã thông báo Web JSON hoặc JWT) cho người dùng có hiệu lực. Bạn có thể sử dụng mã thông báo này để xác thực với các dịch vụ của Google Cloud (chẳng hạn như Cloud Run) được định cấu hình để chấp nhận mã thông báo này.

Bật phạm vi openid

Bạn phải có phạm vi openid để tạo mã thông báo nhận dạng OpenID Connect. Bạn cũng phải liệt kê mọi phạm vi khác mà tập lệnh của bạn sử dụng, chẳng hạn như https://www.googleapis.com/auth/script.external_request cho dịch vụ UrlFetch. Phạm vi https://www.googleapis.com/auth/userinfo.email được đưa vào ví dụ này để thêm địa chỉ email của người dùng vào mã thông báo danh tính.

Trong tệp kê khai (appsscript.json) của dự án tập lệnh, hãy thêm phạm vi openid và mọi phạm vi bắt buộc khác vào mảng oauthScopes:

{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "openid",
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/userinfo.email"
  ]
}

Định cấu hình dịch vụ Google Cloud

Bạn phải định cấu hình dịch vụ Google Cloud để chấp nhận mã thông báo nhận dạng được cấp cho tập lệnh của bạn. Việc này thường bao gồm việc thêm mã ứng dụng khách của tập lệnh làm đối tượng được phép.

Để tìm mã ứng dụng khách của tập lệnh, bạn có thể giải mã mã thông báo nhận dạng:

function logClientId() {
  const idToken = ScriptApp.getIdentityToken();
  const body = idToken.split('.')[1];
  const decoded = Utilities.newBlob(Utilities.base64Decode(body)).getDataAsString();
  const payload = JSON.parse(decoded);
  Logger.log('Client ID: ' + payload.aud);
}

Đối với Cloud Run, bạn có thể định cấu hình đối tượng tuỳ chỉnh để cho phép mã ứng dụng khách này.

Đưa ra yêu cầu đã xác thực

Sau khi định cấu hình, bạn có thể thêm mã nhận dạng vào tiêu đề Authorization của các yêu cầu:

function callCloudRunService() {
  const idToken = ScriptApp.getIdentityToken();
  const url = 'https://your-service-url.a.run.app';

  const response = UrlFetchApp.fetch(url, {
    headers: {
      'Authorization': 'Bearer ' + idToken
    }
  });

  Logger.log(response.getContentText());
}