คำอธิบาย
ใช้ chrome.permissions API เพื่อขอสิทธิ์ที่ไม่บังคับซึ่งประกาศไว้ในรันไทม์แทนเวลาติดตั้ง เพื่อให้ผู้ใช้เข้าใจว่าเหตุใดจึงต้องใช้สิทธิ์และให้สิทธิ์เฉพาะที่จำเป็นเท่านั้น
แนวคิดและการใช้งาน
คำเตือนเกี่ยวกับสิทธิ์มีไว้เพื่ออธิบายความสามารถที่ API มอบให้ แต่คำเตือนบางอย่างอาจไม่ชัดเจน Permissions API ช่วยให้นักพัฒนาแอปอธิบายคำเตือนเกี่ยวกับสิทธิ์และแนะนำฟีเจอร์ใหม่ๆ ได้อย่างค่อยเป็นค่อยไป ซึ่งจะช่วยให้ผู้ใช้ได้รู้จักส่วนขยายโดยไม่มีความเสี่ยง วิธีนี้ช่วยให้ผู้ใช้ระบุระดับการเข้าถึงที่ยินดีให้และฟีเจอร์ที่ต้องการเปิดใช้ได้
ตัวอย่างเช่น ฟังก์ชันหลักของส่วนขยายสิทธิ์ที่ไม่บังคับคือการลบล้างหน้าแท็บใหม่ ฟีเจอร์หนึ่งคือการแสดงเป้าหมายของผู้ใช้ในวันนั้น ฟีเจอร์นี้ต้องใช้สิทธิ์พื้นที่เก็บข้อมูลเท่านั้น ซึ่งไม่มีคำเตือน ส่วนขยายมีฟีเจอร์เพิ่มเติมที่ผู้ใช้เปิดใช้ได้โดยคลิกปุ่มต่อไปนี้
การแสดงเว็บไซต์ยอดนิยมของผู้ใช้ต้องใช้สิทธิ์ topSites ซึ่งมีคำเตือนต่อไปนี้
topSites APIใช้สิทธิ์ที่ไม่บังคับ
ขั้นตอนที่ 1: ตัดสินใจว่าสิทธิ์ใดจำเป็นและสิทธิ์ใดไม่บังคับ
ส่วนขยายสามารถประกาศสิทธิ์ทั้งแบบจำเป็นและไม่บังคับได้ โดยทั่วไป คุณควรทำดังนี้
- ใช้สิทธิ์ที่จำเป็นเมื่อจำเป็นสำหรับฟังก์ชันพื้นฐานของส่วนขยาย
- ใช้สิทธิ์ที่ไม่บังคับเมื่อจำเป็นสำหรับฟีเจอร์ที่ไม่บังคับในส่วนขยาย
ข้อดีของสิทธิ์ที่จำเป็น
- ข้อความแจ้งน้อยลง: ส่วนขยายสามารถแจ้งให้ผู้ใช้ยอมรับสิทธิ์ทั้งหมดได้ในครั้งเดียว
- การพัฒนาที่ง่ายขึ้น: รับประกันว่าสิทธิ์ที่จำเป็นจะปรากฏอยู่
ข้อดีของสิทธิ์ที่ไม่บังคับมีดังนี้
- ความปลอดภัยที่ดีขึ้น: ส่วนขยายจะทำงานโดยใช้สิทธิ์น้อยลงเนื่องจากผู้ใช้จะเปิดใช้เฉพาะสิทธิ์ที่จำเป็นเท่านั้น
- ข้อมูลที่ดีขึ้นสำหรับผู้ใช้: ส่วนขยายสามารถอธิบายเหตุผลที่ต้องใช้สิทธิ์บางอย่างเมื่อผู้ใช้เปิดใช้ฟีเจอร์ที่เกี่ยวข้อง
- อัปเกรดได้ง่ายขึ้น: เมื่อคุณอัปเกรดส่วนขยาย Chrome จะไม่ปิดใช้ส่วนขยายสำหรับผู้ใช้หากการอัปเกรดเพิ่มสิทธิ์ที่ไม่บังคับแทนสิทธิ์ที่จำเป็น
ขั้นตอนที่ 2: ประกาศสิทธิ์ที่ไม่บังคับในไฟล์ Manifest
ประกาศสิทธิ์ที่ไม่บังคับในไฟล์ Manifest ของส่วนขยายด้วยคีย์ optional_permissions โดยใช้รูปแบบเดียวกับช่อง permissions ดังนี้
{
"name": "My extension",
...
"optional_permissions": ["tabs"],
"optional_host_permissions": ["https://www.google.com/"],
...
}
หากต้องการขอโฮสต์ที่คุณค้นพบเฉพาะในรันไทม์ ให้ใส่ "https://*/*" ในช่อง optional_host_permissions ของส่วนขยาย ซึ่งจะช่วยให้คุณระบุต้นทางใน "Permissions.origins" ได้ตราบใดที่มีรูปแบบที่ตรงกัน
สิทธิ์ที่ไม่สามารถระบุเป็นไม่บังคับได้
สิทธิ์ส่วนขยาย Chrome ส่วนใหญ่สามารถระบุเป็นแบบไม่บังคับได้ โดยมีข้อยกเว้นดังต่อไปนี้
| สิทธิ์ | คำอธิบาย |
|---|---|
"debugger" |
browser.debugger API ทำหน้าที่เป็นตัวส่งทางเลือกสำหรับโปรโตคอลการแก้ไขข้อบกพร่องระยะไกลของ Chrome |
"declarativeNetRequest" |
ให้สิทธิ์ส่วนขยายเข้าถึง API browser.declarativeNetRequest |
"devtools" |
อนุญาตให้ส่วนขยายขยายฟังก์ชันการทำงานของ เครื่องมือสำหรับนักพัฒนาเว็บใน Chrome |
"geolocation" |
อนุญาตให้ส่วนขยายใช้ API ตำแหน่งทางภูมิศาสตร์ของ HTML5 |
"mdns" |
ให้สิทธิ์เข้าถึง API browser.mdns แก่ส่วนขยาย |
"proxy" |
ให้สิทธิ์เข้าถึง API browser.proxy แก่ส่วนขยายเพื่อจัดการการตั้งค่าพร็อกซีของ Chrome |
"tts" |
API browser.tts จะเล่นการอ่านออกเสียงข้อความ (TTS) สังเคราะห์ |
"ttsEngine" |
browser.ttsEngine API ใช้เครื่องมืออ่านออกเสียงข้อความ (TTS) โดยใช้ส่วนขยาย |
"wallpaper" |
ChromeOS เท่านั้น ใช้ API browser.wallpaper เพื่อเปลี่ยนวอลเปเปอร์ ChromeOS |
ดูประกาศสิทธิ์เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับสิทธิ์ที่ใช้ได้และคำเตือนของสิทธิ์เหล่านั้น
ขั้นตอนที่ 3: ขอสิทธิ์ที่ไม่บังคับ
ขอสิทธิ์จากภายในท่าทางผู้ใช้โดยใช้ permissions.request():
document.querySelector('#my-button').addEventListener('click', (event) => {
// Permissions must be requested from inside a user gesture, like a button's
// click handler.
browser.permissions.request({
permissions: ['tabs'],
origins: ['https://www.google.com/']
}, (granted) => {
// The callback argument will be true if the user granted the permissions.
if (granted) {
doSomething();
} else {
doSomethingElse();
}
});
});
Chrome จะแจ้งให้ผู้ใช้ทราบหากการเพิ่มสิทธิ์ส่งผลให้เกิดข้อความเตือนที่แตกต่างจากที่ผู้ใช้เคยเห็นและยอมรับแล้ว ตัวอย่างเช่น โค้ดก่อนหน้าอาจส่งผลให้เกิดข้อความแจ้งดังนี้
ขั้นตอนที่ 4: ตรวจสอบสิทธิ์ปัจจุบันของส่วนขยาย
หากต้องการตรวจสอบว่าส่วนขยายมีสิทธิ์หรือชุดสิทธิ์ที่เฉพาะเจาะจงหรือไม่ ให้ใช้ permission.contains() ดังนี้
browser.permissions.contains({
permissions: ['tabs'],
origins: ['https://www.google.com/']
}, (result) => {
if (result) {
// The extension has the permissions.
} else {
// The extension doesn't have the permissions.
}
});
ขั้นตอนที่ 5: นำสิทธิ์ออก
คุณควรนำสิทธิ์ออกเมื่อไม่ต้องการใช้แล้ว หลังจากนำสิทธิ์ออกแล้ว การเรียกใช้ permissions.request() มักจะเพิ่มสิทธิ์กลับมาโดยไม่แจ้งให้ผู้ใช้ทราบ
browser.permissions.remove({
permissions: ['tabs'],
origins: ['https://www.google.com/']
}, (removed) => {
if (removed) {
// The permissions have been removed.
} else {
// The permissions have not been removed (e.g., you tried to remove
// required permissions).
}
});
ประเภท
Permissions
พร็อพเพอร์ตี้
-
origins
string[] ไม่บังคับ
รายการสิทธิ์ของโฮสต์ รวมถึงสิทธิ์ที่ระบุไว้ในคีย์
optional_permissionsหรือpermissionsในไฟล์ Manifest และสิทธิ์ที่เชื่อมโยงกับสคริปต์เนื้อหา -
สิทธิ์
string[] ไม่บังคับ
รายการสิทธิ์ที่มีชื่อ (ไม่รวมโฮสต์หรือต้นทาง)
เมธอด
addHostAccessRequest()
browser.permissions.addHostAccessRequest(
request: object,
): Promise<void>
เพิ่มคำขอเข้าถึงโฮสต์ ระบบจะส่งสัญญาณคำขอไปยังผู้ใช้ก็ต่อเมื่อส่วนขยายได้รับสิทธิ์เข้าถึงโฮสต์ในคำขอเท่านั้น ระบบจะรีเซ็ตคำขอในการนำทางแบบข้ามต้นทาง เมื่อยอมรับแล้ว จะให้สิทธิ์เข้าถึงต้นทางระดับบนสุดของเว็บไซต์อย่างถาวร
พารามิเตอร์
-
ส่งคำขอ
ออบเจ็กต์
-
documentId
สตริง ไม่บังคับ
รหัสของเอกสารที่แสดงคำขอเข้าถึงโฮสต์ได้ ต้องเป็นเอกสารระดับบนสุดภายในแท็บ หากระบุไว้ คำขอจะแสดงในแท็บของเอกสารที่ระบุ และจะถูกนำออกเมื่อเอกสารไปยังต้นทางใหม่ การเพิ่มคำขอใหม่จะลบล้างคำขอที่มีอยู่สำหรับ
tabIdต้องระบุค่านี้หรือtabId -
รูปแบบ
สตริง ไม่บังคับ
รูปแบบ URL ที่แสดงคำขอเข้าถึงโฮสต์ได้ หากระบุไว้ คำขอเข้าถึงโฮสต์จะแสดงใน URL ที่ตรงกับรูปแบบนี้เท่านั้น
-
tabId
number ไม่บังคับ
รหัสของแท็บที่แสดงคำขอเข้าถึงโฮสต์ได้ หากระบุไว้ คำขอจะแสดงในแท็บที่ระบุและจะถูกนำออกเมื่อแท็บไปยังต้นทางใหม่ การเพิ่มคำขอใหม่จะลบล้างคำขอที่มีอยู่สำหรับ
documentIdต้องระบุค่านี้หรือdocumentId
-
การคืนสินค้า
-
Promise<void>
contains()
browser.permissions.contains(
permissions: Permissions,
): Promise<boolean>
ตรวจสอบว่าส่วนขยายมีสิทธิ์ที่ระบุหรือไม่
พารามิเตอร์
-
สิทธิ์
การคืนสินค้า
-
Promise<boolean>
Chrome 96 ขึ้นไป browser.* ตั้งแต่ Chrome 148
การคืนสินค้า
-
Promise<Permissions>
Chrome 96 ขึ้นไป browser.* ตั้งแต่ Chrome 148
remove()
browser.permissions.remove(
permissions: Permissions,
): Promise<boolean>
นำสิทธิ์เข้าถึงสิทธิ์ที่ระบุออก หากมีปัญหาในการนำสิทธิ์ออก ระบบจะปฏิเสธ Promise
พารามิเตอร์
-
สิทธิ์
การคืนสินค้า
-
Promise<boolean>
Chrome 96 ขึ้นไป browser.* ตั้งแต่ Chrome 148
removeHostAccessRequest()
browser.permissions.removeHostAccessRequest(
request: object,
): Promise<void>
นำคำขอเข้าถึงโฮสต์ออก (หากมี)
พารามิเตอร์
-
ส่งคำขอ
ออบเจ็กต์
-
documentId
สตริง ไม่บังคับ
รหัสของเอกสารที่จะนำคำขอเข้าถึงโฮสต์ออก ต้องเป็นเอกสารระดับบนสุดภายในแท็บ ต้องระบุค่านี้หรือ
tabId -
รูปแบบ
สตริง ไม่บังคับ
รูปแบบ URL ที่จะนำคำขอเข้าถึงโฮสต์ออก หากระบุไว้ ค่านี้ต้องตรงกับรูปแบบของคำขอเข้าถึงโฮสต์ที่มีอยู่ทุกประการ
-
tabId
number ไม่บังคับ
รหัสของแท็บที่จะนำคำขอเข้าถึงของโฮสต์ออก ต้องระบุค่านี้หรือ
documentId
-
การคืนสินค้า
-
Promise<void>
request()
browser.permissions.request(
permissions: Permissions,
): Promise<boolean>
ขอสิทธิ์เข้าถึงสิทธิ์ที่ระบุ โดยแสดงข้อความแจ้งแก่ผู้ใช้หากจำเป็น สิทธิ์เหล่านี้ต้องกำหนดไว้ในช่อง optional_permissions ของไฟล์ Manifest หรือเป็นสิทธิ์ที่จำเป็นซึ่งผู้ใช้ระงับไว้ ระบบจะไม่สนใจเส้นทางในรูปแบบต้นทาง คุณสามารถขอชุดย่อยของสิทธิ์ต้นทางที่ไม่บังคับได้ เช่น หากระบุ *://*\/* ในส่วน optional_permissions ของไฟล์ Manifest คุณจะขอ http://example.com/ ได้ หากมีปัญหาในการขอสิทธิ์ ระบบจะปฏิเสธสัญญา
พารามิเตอร์
-
สิทธิ์
การคืนสินค้า
-
Promise<boolean>
Chrome 96 ขึ้นไป browser.* ตั้งแต่ Chrome 148
กิจกรรม
onAdded
browser.permissions.onAdded.addListener(
callback: function,
)
เริ่มทำงานเมื่อส่วนขยายได้รับสิทธิ์ใหม่
พารามิเตอร์
-
callback
ฟังก์ชัน
พารามิเตอร์
callbackจะมีลักษณะดังนี้(permissions: Permissions) => void
-
สิทธิ์
-
onRemoved
browser.permissions.onRemoved.addListener(
callback: function,
)
เริ่มทำงานเมื่อนำสิทธิ์เข้าถึงออกจากส่วนขยาย
พารามิเตอร์
-
callback
ฟังก์ชัน
พารามิเตอร์
callbackจะมีลักษณะดังนี้(permissions: Permissions) => void
-
สิทธิ์
-