ตรวจสอบสิทธิ์ในฐานะโปรเจ็กต์ Apps Script โดยใช้บัญชีบริการ

คู่มือนี้จะอธิบายวิธีตรวจสอบสิทธิ์ด้วยบัญชีบริการเมื่อเรียกใช้ API ใน Apps Script

บัญชีบริการเป็นบัญชีชนิดพิเศษที่แอปพลิเคชันใช้ ไม่ใช่บุคคล คุณใช้บัญชีบริการเพื่อเข้าถึงข้อมูลหรือดำเนินการ โดยบัญชีหุ่นยนต์ หรือเพื่อเข้าถึงข้อมูลในนามของผู้ใช้ Google Workspace หรือ Cloud Identity ได้ ดูข้อมูลเพิ่มเติมได้ที่ทำความเข้าใจบัญชีบริการ

ดูภาพรวมเกี่ยวกับการตรวจสอบสิทธิ์สำหรับ Google Workspace API ได้ที่หัวข้อ สร้างข้อมูลเข้าถึง

กรณีที่ควรใช้บัญชีบริการใน Apps Script

เหตุผลบางประการที่คุณอาจพิจารณาใช้การตรวจสอบสิทธิ์ด้วยบัญชีบริการแทนวิธีการตรวจสอบสิทธิ์อื่นๆ เช่น ScriptApp.getOAuthToken() มีดังนี้

  • ประสิทธิภาพที่ดีขึ้นด้วย Google Cloud APIs และบริการ: Google Cloud APIs หลายรายการได้รับการออกแบบมาเพื่อการตรวจสอบสิทธิ์บัญชีบริการ นอกจากนี้ บัญชีบริการยังเป็นวิธีที่ผสานรวม น่าเชื่อถือ และปลอดภัยยิ่งขึ้น ในการโต้ตอบกับ API ส่วนใหญ่
  • สิทธิ์ที่แยกจากกัน: บัญชีบริการมีสิทธิ์ของตัวเองแยกจากผู้ใช้ วิธีการตรวจสอบสิทธิ์ ScriptApp.getOAuthToken()อาจล้มเหลวเมื่อคุณแชร์โปรเจ็กต์ Apps Script กับผู้ใช้รายอื่น การใช้บัญชีบริการช่วยให้คุณแชร์สคริปต์และเผยแพร่เป็นส่วนเสริมของ Google Workspace ได้
  • สคริปต์อัตโนมัติและงานที่ใช้เวลานาน: บัญชีบริการช่วยให้คุณเรียกใช้ สคริปต์อัตโนมัติ กระบวนการแบบเป็นชุด หรืองานในเบื้องหลังได้โดยไม่ต้องป้อนข้อมูลจากผู้ใช้
  • ความปลอดภัยที่ดียิ่งขึ้นและหลักการให้สิทธิ์ขั้นต่ำ: คุณสามารถให้สิทธิ์ที่เฉพาะเจาะจงแก่บัญชีบริการ ซึ่งจะให้สิทธิ์เข้าถึงเฉพาะทรัพยากรที่จำเป็นเท่านั้น ซึ่งเป็นไปตามหลักการให้สิทธิ์ขั้นต่ำที่สุด ซึ่งจะช่วยลดความเสี่ยงด้านความปลอดภัย การใช้ ScriptApp.getOAuthToken() มักจะให้สิทธิ์ทั้งหมดของผู้ใช้แก่สคริปต์ ซึ่งอาจกว้างเกินไป
  • การจัดการการเข้าถึงแบบรวมศูนย์: ระบบจะจัดการบัญชีบริการโดยใช้ Identity and Access Management (IAM) ของ Google Cloud IAM ช่วยให้องค์กร Google Workspace จัดการการเข้าถึง บริการที่ตรวจสอบสิทธิ์แล้วภายในโปรเจ็กต์ Apps Script ได้

ข้อกำหนดเบื้องต้น

สร้างบัญชีบริการ

สร้างบัญชีบริการในโปรเจ็กต์ Cloud โดยทำดังนี้

คอนโซล Google Cloud

  1. ใน Google Cloud Console ให้ไปที่เมนู > IAM & Admin > บัญชีบริการ

    ไปที่บัญชีบริการ

  2. คลิกสร้างบัญชีบริการ
  3. กรอกรายละเอียดบัญชีบริการ แล้วคลิกสร้างและดำเนินการต่อ
  4. ไม่บังคับ: มอบหมายบทบาทให้กับบัญชีบริการเพื่อให้สิทธิ์เข้าถึงทรัพยากรของโปรเจ็กต์ Google Cloud ดูรายละเอียดเพิ่มเติมได้ที่การให้ เปลี่ยน และเพิกถอนสิทธิ์เข้าถึงทรัพยากร
  5. คลิกต่อไป
  6. ไม่บังคับ: ป้อนผู้ใช้หรือกลุ่มที่จัดการและดำเนินการกับบัญชีบริการนี้ได้ โปรดดูรายละเอียดเพิ่มเติมที่หัวข้อการจัดการการแอบอ้างเป็นบัญชีบริการ
  7. คลิกเสร็จสิ้น จดอีเมลของบัญชีบริการไว้

gcloud CLI

  1. สร้างบัญชีบริการโดยทำดังนี้
    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
      --display-name="SERVICE_ACCOUNT_NAME"
  2. ไม่บังคับ: มอบหมายบทบาทให้กับบัญชีบริการเพื่อให้สิทธิ์เข้าถึงทรัพยากรของโปรเจ็กต์ Google Cloud ดูรายละเอียดเพิ่มเติมได้ที่การให้ เปลี่ยน และเพิกถอนสิทธิ์เข้าถึงทรัพยากร

มอบหมายบทบาทให้กับบัญชีบริการ

คุณต้องมอบหมายบทบาทที่สร้างไว้ล่วงหน้าหรือกำหนดเองให้กับบัญชีบริการโดยใช้บัญชีผู้ดูแลระบบขั้นสูง

  1. ในคอนโซลผู้ดูแลระบบของ Google ให้ไปที่เมนู > บัญชี > บทบาทผู้ดูแลระบบ

    ไปที่บทบาทของผู้ดูแลระบบ

  2. ชี้ไปที่บทบาทที่ต้องการมอบหมาย แล้วคลิกมอบหมายเป็นผู้ดูแลระบบ

  3. คลิกมอบหมายบัญชีบริการ

  4. ป้อนอีเมลของบัญชีบริการ

  5. คลิกเพิ่ม > มอบหมายบทบาท

สร้างข้อมูลเข้าสู่ระบบสำหรับบัญชีบริการ

คุณต้องขอรับข้อมูลเข้าสู่ระบบในรูปแบบคู่คีย์สาธารณะ/ส่วนตัว โค้ดของคุณใช้ข้อมูลเข้าสู่ระบบเหล่านี้เพื่อให้สิทธิ์การดำเนินการของบัญชีบริการภายในแอป

วิธีรับข้อมูลเข้าสู่ระบบสำหรับบัญชีบริการ

  1. ใน Google Cloud Console ให้ไปที่เมนู > IAM & Admin > บัญชีบริการ

    ไปที่บัญชีบริการ

  2. เลือกบัญชีบริการ
  3. คลิกคีย์ > เพิ่มคีย์ > สร้างคีย์ใหม่
  4. เลือก JSON แล้วคลิกสร้าง

    ระบบจะสร้างคู่คีย์สาธารณะ/ส่วนตัวใหม่และดาวน์โหลดลงในเครื่องของคุณเป็นไฟล์ใหม่ บันทึกไฟล์ JSON ที่ดาวน์โหลดเป็น credentials.json ใน ไดเรกทอรีการทำงาน ไฟล์นี้เป็นสำเนาเดียวของคีย์นี้ ดูข้อมูลเกี่ยวกับวิธีจัดเก็บคีย์อย่างปลอดภัยได้ที่การจัดการคีย์ของบัญชีบริการ

  5. คลิกปิด

คัดลอกหมายเลขโปรเจ็กต์ที่อยู่ในระบบคลาวด์

  1. ใน Google Cloud Console ให้ไปที่เมนู > IAM และผู้ดูแลระบบ > การตั้งค่า

    ไปที่การตั้งค่า IAM และผู้ดูแลระบบ

  2. คัดลอกค่าในช่องหมายเลขโปรเจ็กต์

ตั้งค่าการตรวจสอบสิทธิ์บัญชีบริการในโปรเจ็กต์ Apps Script

ส่วนนี้จะอธิบายวิธีเพิ่มข้อมูลเข้าสู่ระบบของบัญชีบริการจากโปรเจ็กต์ Cloud ลงในโปรเจ็กต์ Apps Script

ตั้งค่าโปรเจ็กต์ Cloud ใน Apps Script

  1. ไปที่ Apps Script เพื่อเปิดหรือสร้างโปรเจ็กต์


    เปิด Apps Script

  2. ในโปรเจ็กต์ Apps Script ให้ คลิกการตั้งค่าโปรเจ็กต์ ไอคอนสำหรับการตั้งค่าโปรเจ็กต์

  3. ในส่วนโปรเจ็กต์ Google Cloud Platform (GCP) ให้คลิกเปลี่ยนโปรเจ็กต์

  4. ในหมายเลขโปรเจ็กต์ GCP ให้วางหมายเลขโปรเจ็กต์ Google Cloud

  5. คลิกตั้งค่าโปรเจ็กต์

บันทึกข้อมูลเข้าสู่ระบบเป็นพร็อพเพอร์ตี้ของสคริปต์

จัดเก็บข้อมูลเข้าสู่ระบบของบัญชีบริการอย่างปลอดภัยโดยบันทึกข้อมูลดังกล่าวเป็นพร็อพเพอร์ตี้สคริปต์ในการตั้งค่าโปรเจ็กต์ Apps Script ดังนี้

  1. คัดลอกเนื้อหาของไฟล์ JSON ของบัญชีบริการ (credentials.json) ที่คุณสร้างไว้ในส่วนก่อนหน้า
  2. ในโปรเจ็กต์ Apps Script ให้ไปที่การตั้งค่าโปรเจ็กต์
  3. จากหน้าการตั้งค่าโปรเจ็กต์ ให้ไปที่พร็อพเพอร์ตี้สคริปต์ แล้วคลิก เพิ่มพร็อพเพอร์ตี้สคริปต์ แล้วป้อนข้อมูลต่อไปนี้
    • ป้อน SERVICE_ACCOUNT_KEY ในช่องพร็อพเพอร์ตี้
    • ในช่องค่า ให้วางเนื้อหาของไฟล์คีย์ JSON
  4. คลิกบันทึกพร็อพเพอร์ตี้ของสคริปต์

เพิ่มไลบรารี OAuth2

หากต้องการจัดการขั้นตอนการตรวจสอบสิทธิ์ OAuth2 คุณสามารถใช้ คลัง Apps Script apps-script-oauth2

วิธีเพิ่มไลบรารีลงในโปรเจ็กต์ Apps Script

  1. ในเครื่องมือแก้ไข Apps Script ให้คลิกเพิ่มคลังที่ด้านซ้ายข้างคลัง
  2. ในช่องรหัสสคริปต์ ให้ป้อน 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
  3. คลิกค้นหา
  4. เลือกเวอร์ชันล่าสุด แล้วคลิกเพิ่ม

เรียกใช้ API โดยใช้ข้อมูลเข้าสู่ระบบของบัญชีบริการ

หากต้องการใช้ข้อมูลเข้าสู่ระบบบัญชีบริการจากโปรเจ็กต์ Apps Script คุณสามารถใช้ฟังก์ชันต่อไปนี้ getServiceAccountService()

/**
 * Get a new OAuth2 service for a given service account.
 */
function getServiceAccountService() {
  const serviceAccountKeyString = PropertiesService.getScriptProperties()
      .getProperty('SERVICE_ACCOUNT_KEY');

  if (!serviceAccountKeyString) {
    throw new Error('SERVICE_ACCOUNT_KEY property is not set. ' +
        'Please follow the setup instructions.');
  }

  const serviceAccountKey = JSON.parse(serviceAccountKeyString);

  const CLIENT_EMAIL = serviceAccountKey.client_email;
  const PRIVATE_KEY = serviceAccountKey.private_key;

  // Replace with the specific scopes required for your API.
  const SCOPES = ['SCOPE'];

  return OAuth2.createService('ServiceAccount')
      .setTokenUrl('https://oauth2.googleapis.com/token')
      .setPrivateKey(PRIVATE_KEY)
      .setIssuer(CLIENT_EMAIL)
      .setPropertyStore(PropertiesService.getScriptProperties())
      .setScope(SCOPES);
}

แทนที่ SCOPE ด้วย ขอบเขตการให้สิทธิ์ที่คุณต้องใช้เพื่อเรียก API สคริปต์ใช้ข้อมูลเข้าสู่ระบบบัญชีบริการที่คุณบันทึกไว้เป็นSERVICE_ACCOUNT_KEYพร็อพเพอร์ตี้สคริปต์ในขั้นตอนก่อนหน้า

จากนั้นคุณจะใช้ข้อมูลเข้าสู่ระบบเหล่านี้เพื่อเรียก API ได้ตามที่แสดงในตัวอย่างต่อไปนี้ กับบริการ UrlFetch

function callApi() {
  const service = getServiceAccountService();

  // TODO(developer): Replace with the payload
  const payload = {};

  // TODO(developer): Replace with the API endpoint
  const response = UrlFetchApp.fetch('API_URL', {
    method: 'post',
    headers: {
      'Authorization': `Bearer ${service.getAccessToken()}`,
      'Content-Type': 'application/json',
    },
    payload: payload,
  });

  const result = JSON.parse(response.getContentText());

  return result;
}

แทนที่ API_URL ด้วยปลายทาง HTTP ที่คุณ เรียก