คู่มือนี้อธิบายวิธีตรวจสอบสิทธิ์ด้วยบัญชีบริการเมื่อเรียกใช้ API ใน Apps Script
บัญชีบริการเป็นบัญชีชนิดพิเศษที่แอปพลิเคชันใช้ ไม่ใช่บุคคล คุณใช้บัญชีบริการเพื่อเข้าถึงข้อมูลหรือดำเนินการ โดยบัญชีหุ่นยนต์ หรือเพื่อเข้าถึงข้อมูลในนามของผู้ใช้ Google Workspace หรือ Cloud Identity ได้ ดูข้อมูลเพิ่มเติมได้ที่ทำความเข้าใจบัญชีบริการดูภาพรวมเกี่ยวกับการตรวจสอบสิทธิ์สำหรับ Google Workspace API ได้ที่หัวข้อ สร้างข้อมูลเข้าถึง
เมื่อใดที่ควรใช้บัญชีบริการใน Apps Script
โดยค่าเริ่มต้น Apps Script จะใช้ข้อมูลเข้าสู่ระบบของผู้ใช้สคริปต์เพื่อเรียก API
หากเรียกใช้ Google API โดยใช้ UrlFetchApp คุณจะรับโทเค็นการเข้าถึงสำหรับผู้ใช้สคริปต์ได้โดยการเรียกใช้ ScriptApp.getOAuthToken
อย่างไรก็ตาม การใช้บัญชีบริการมีข้อดีหลายประการเหนือกว่า
ScriptApp.getOAuthToken ในบางสถานการณ์ โปรดพิจารณาใช้การตรวจสอบสิทธิ์บัญชีบริการด้วยเหตุผลต่อไปนี้
- ประสิทธิภาพที่ดีขึ้นด้วย Google Cloud APIs และบริการ: Google Cloud APIs หลายรายการได้รับการออกแบบมาเพื่อการตรวจสอบสิทธิ์บัญชีบริการ นอกจากนี้ บัญชีบริการยังเป็นวิธีที่ผสานรวม น่าเชื่อถือ และปลอดภัยยิ่งขึ้น ในการโต้ตอบกับ API ส่วนใหญ่ได้ด้วย
- สิทธิ์ที่แยกจากกัน: บัญชีบริการมีสิทธิ์ของตัวเอง
แยกจากผู้ใช้ วิธีการตรวจสอบสิทธิ์
ScriptApp.getOAuthTokenอาจล้มเหลวเมื่อคุณแชร์โปรเจ็กต์กับผู้ใช้ รายอื่น ใช้บัญชีบริการเพื่อแชร์สคริปต์และเผยแพร่เป็นส่วนเสริมของ Google Workspace - สคริปต์อัตโนมัติและงานที่ใช้เวลานาน: บัญชีบริการช่วยให้คุณเรียกใช้ สคริปต์อัตโนมัติ กระบวนการแบบเป็นชุด หรืองานในเบื้องหลังได้โดยไม่ต้องป้อนข้อมูลจากผู้ใช้
- ความปลอดภัยที่ดียิ่งขึ้นและหลักการให้สิทธิ์ขั้นต่ำ: ให้สิทธิ์เฉพาะแก่บัญชีบริการ ซึ่งจะให้สิทธิ์เข้าถึงเฉพาะทรัพยากรที่บัญชีบริการนั้นๆ ต้องการ ซึ่งเป็นไปตามหลักการให้สิทธิ์ขั้นต่ำที่สุด ซึ่งจะช่วยลดความเสี่ยงด้านความปลอดภัย การใช้
ScriptApp.getOAuthTokenมักจะให้สิทธิ์ทั้งหมดแก่สคริปต์ ของผู้ใช้ ซึ่งอาจกว้างเกินไป - การจัดการการเข้าถึงแบบรวมศูนย์: จัดการบัญชีบริการโดยใช้ Identity and Access Management (IAM) ของ Google Cloud IAM ช่วยให้องค์กร Google Workspace จัดการสิทธิ์เข้าถึง บริการที่ตรวจสอบสิทธิ์แล้วภายในโปรเจ็กต์ Apps Script
ข้อกำหนดเบื้องต้น
- โปรเจ็กต์ Google Cloud
- ในโปรเจ็กต์ Cloud ให้เปิดใช้ API ที่ต้องการ ตรวจสอบสิทธิ์โดยใช้ข้อมูลเข้าสู่ระบบบัญชีบริการ
- หากต้องการมอบหมายบทบาทให้กับบัญชีบริการ คุณต้องมีสิทธิ์ของผู้ดูแลระบบขั้นสูง
สร้างบัญชีบริการ
สร้างบัญชีบริการในโปรเจ็กต์ Cloud โดยทำดังนี้
คอนโซล Google Cloud
- ใน Google Cloud Console ให้ไปที่เมนู > IAM & Admin > บัญชีบริการ
- คลิกสร้างบัญชีบริการ
- กรอกรายละเอียดบัญชีบริการ แล้วคลิกสร้างและดำเนินการต่อ
- ไม่บังคับ: มอบหมายบทบาทให้กับบัญชีบริการเพื่อให้สิทธิ์เข้าถึงทรัพยากรของโปรเจ็กต์ Google Cloud ดูรายละเอียดเพิ่มเติมได้ที่การให้ เปลี่ยน และเพิกถอนสิทธิ์เข้าถึงทรัพยากร
- คลิกต่อไป
- ไม่บังคับ: ป้อนผู้ใช้หรือกลุ่มที่จัดการและดำเนินการกับบัญชีบริการนี้ได้ โปรดดูรายละเอียดเพิ่มเติมที่หัวข้อการจัดการการแอบอ้างเป็นบัญชีบริการ
- คลิกเสร็จสิ้น จดอีเมลของบัญชีบริการไว้
gcloud CLI
- สร้างบัญชีบริการโดยทำดังนี้
gcloud iam service-accounts createSERVICE_ACCOUNT_NAME\ --display-name="SERVICE_ACCOUNT_NAME" - ไม่บังคับ: มอบหมายบทบาทให้กับบัญชีบริการเพื่อให้สิทธิ์เข้าถึงทรัพยากรของโปรเจ็กต์ Google Cloud ดูรายละเอียดเพิ่มเติมได้ที่การให้ เปลี่ยน และเพิกถอนสิทธิ์เข้าถึงทรัพยากร
มอบหมายบทบาทให้กับบัญชีบริการ
คุณต้องมอบหมายบทบาทที่สร้างไว้ล่วงหน้าหรือกำหนดเองให้กับบัญชีบริการโดยใช้บัญชีผู้ดูแลระบบขั้นสูง
ในคอนโซลผู้ดูแลระบบของ Google ให้ไปที่เมนู > บัญชี > บทบาทผู้ดูแลระบบ
ชี้ไปที่บทบาทที่ต้องการมอบหมาย แล้วคลิกมอบหมายเป็นผู้ดูแลระบบ
คลิกมอบหมายบัญชีบริการ
ป้อนอีเมลของบัญชีบริการ
คลิกเพิ่ม > มอบหมายบทบาท
สร้างข้อมูลเข้าสู่ระบบสำหรับบัญชีบริการ
คุณต้องขอรับข้อมูลเข้าสู่ระบบในรูปแบบคู่คีย์สาธารณะ/ส่วนตัว โค้ดของคุณใช้ข้อมูลเข้าสู่ระบบเหล่านี้เพื่อให้สิทธิ์การดำเนินการของบัญชีบริการภายในแอปวิธีรับข้อมูลเข้าสู่ระบบสำหรับบัญชีบริการ
- ใน Google Cloud Console ให้ไปที่เมนู > IAM & Admin > บัญชีบริการ
- เลือกบัญชีบริการ
- คลิกคีย์ > เพิ่มคีย์ > สร้างคีย์ใหม่
- เลือก JSON แล้วคลิกสร้าง
ระบบจะสร้างคู่คีย์สาธารณะ/ส่วนตัวใหม่และดาวน์โหลดลงในเครื่องของคุณเป็นไฟล์ใหม่ บันทึกไฟล์ JSON ที่ดาวน์โหลดเป็น
credentials.jsonใน ไดเรกทอรีการทำงาน ไฟล์นี้เป็นสำเนาเดียวของคีย์นี้ ดูข้อมูลเกี่ยวกับวิธีจัดเก็บคีย์อย่างปลอดภัยได้ที่การจัดการคีย์ของบัญชีบริการ - คลิกปิด
คัดลอกหมายเลขโปรเจ็กต์ที่อยู่ในระบบคลาวด์
- ใน Google Cloud Console ให้ไปที่เมนู > IAM และผู้ดูแลระบบ > การตั้งค่า
- คัดลอกค่าในช่องหมายเลขโปรเจ็กต์
ตั้งค่าการตรวจสอบสิทธิ์บัญชีบริการในโปรเจ็กต์ Apps Script
ส่วนนี้อธิบายวิธีเพิ่มข้อมูลเข้าสู่ระบบของบัญชีบริการจากโปรเจ็กต์ Cloud ลงในโปรเจ็กต์ Apps Script
ตั้งค่าโปรเจ็กต์ Cloud ใน Apps Script
ไปที่ Apps Script เพื่อเปิดหรือสร้างโปรเจ็กต์
ในโปรเจ็กต์ Apps Script ให้ คลิกการตั้งค่าโปรเจ็กต์
ในส่วนโปรเจ็กต์ Google Cloud ให้คลิกเปลี่ยนโปรเจ็กต์
ในหมายเลขโปรเจ็กต์ Google Cloud ให้วางหมายเลขโปรเจ็กต์ที่อยู่ในระบบคลาวด์
คลิกตั้งค่าโปรเจ็กต์
บันทึกข้อมูลเข้าสู่ระบบเป็นพร็อพเพอร์ตี้ของสคริปต์
จัดเก็บข้อมูลเข้าสู่ระบบของบัญชีบริการอย่างปลอดภัยโดยบันทึกข้อมูลดังกล่าวเป็นพร็อพเพอร์ตี้สคริปต์ในการตั้งค่าโปรเจ็กต์ Apps Script
- คัดลอกเนื้อหาของไฟล์ JSON ของบัญชีบริการ (
credentials.json) ที่คุณสร้างไว้ในส่วนก่อนหน้า - ในโปรเจ็กต์ Apps Script ให้ไปที่การตั้งค่าโปรเจ็กต์
- จากหน้าการตั้งค่าโปรเจ็กต์ ให้ไปที่พร็อพเพอร์ตี้สคริปต์ แล้วคลิก
เพิ่มพร็อพเพอร์ตี้สคริปต์ แล้วป้อนข้อมูลต่อไปนี้
- ป้อน
SERVICE_ACCOUNT_KEYในช่องพร็อพเพอร์ตี้ - ในช่องค่า ให้วางเนื้อหาของไฟล์คีย์ JSON
- ป้อน
- คลิกบันทึกพร็อพเพอร์ตี้ของสคริปต์
เพิ่มไลบรารี OAuth2
หากต้องการจัดการโฟลว์การตรวจสอบสิทธิ์ OAuth2 ให้ใช้ไลบรารี Apps Script
apps-script-oauth2
วิธีเพิ่มไลบรารีลงในโปรเจ็กต์ Apps Script
- ในเครื่องมือแก้ไข Apps Script ให้คลิกเพิ่มคลัง ทางด้านซ้ายข้างคลัง
- ในช่องรหัสสคริปต์ ให้ป้อน
1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF - คลิกค้นหา
- เลือกเวอร์ชันล่าสุด แล้วคลิกเพิ่ม
เรียกใช้ 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 ที่คุณ
เรียก