คำอธิบาย
ใช้ chrome.permissions
API เพื่อขอสิทธิ์ที่ไม่บังคับที่ประกาศไว้ขณะรันไทม์แทนที่จะเป็นขณะติดตั้ง เพื่อให้ผู้ใช้เข้าใจถึงเหตุผลที่ต้องมีสิทธิ์ดังกล่าวและมอบสิทธิ์เฉพาะที่จำเป็นเท่านั้น
แนวคิดและการใช้งาน
คำเตือนเกี่ยวกับสิทธิ์มีไว้เพื่ออธิบายความสามารถที่ API ให้สิทธิ์ แต่คำเตือนบางอย่างอาจไม่ชัดเจน Permissions API ช่วยให้นักพัฒนาแอปอธิบายคำเตือนเกี่ยวกับสิทธิ์และแนะนำฟีเจอร์ใหม่ทีละน้อย ซึ่งช่วยให้ผู้ใช้ได้รู้จักส่วนขยายอย่างปลอดภัย วิธีนี้ช่วยให้ผู้ใช้ระบุระดับการเข้าถึงที่ต้องการมอบและฟีเจอร์ที่ต้องการเปิดใช้ได้
ตัวอย่างเช่น ฟังก์ชันหลักของส่วนขยายสิทธิ์ที่ไม่บังคับลบล้างหน้าแท็บใหม่ ฟีเจอร์หนึ่งคือการแสดงเป้าหมายของผู้ใช้ในแต่ละวัน ฟีเจอร์นี้ต้องใช้สิทธิ์พื้นที่เก็บข้อมูลเท่านั้น ซึ่งจะไม่แสดงคำเตือน ส่วนขยายนี้มีฟีเจอร์เพิ่มเติมที่ผู้ใช้เปิดใช้ได้โดยคลิกปุ่มต่อไปนี้
การแสดงเว็บไซต์ยอดนิยมของผู้ใช้ต้องใช้สิทธิ์ topSites ซึ่งมีคำเตือนดังต่อไปนี้
ใช้สิทธิ์ที่ไม่บังคับ
ขั้นตอนที่ 1: เลือกสิทธิ์ที่จําเป็นและไม่จําเป็น
ส่วนขยายสามารถประกาศสิทธิ์ที่จําเป็นและไม่บังคับได้ โดยทั่วไปแล้ว คุณควรดำเนินการดังนี้
- ใช้สิทธิ์ที่จําเป็นเมื่อจําเป็นสําหรับฟังก์ชันการทํางานพื้นฐานของส่วนขยาย
- ใช้สิทธิ์ที่ไม่บังคับเมื่อจําเป็นต้องใช้กับฟีเจอร์ที่ไม่บังคับในส่วนขยาย
ข้อดีของสิทธิ์ที่จําเป็น
- ข้อความแจ้งน้อยลง: ส่วนขยายจะแจ้งให้ผู้ใช้ยอมรับสิทธิ์ทั้งหมดได้เพียงครั้งเดียว
- การพัฒนาที่ง่ายขึ้น: รับประกันว่าจะมีสิทธิ์ที่จำเป็น
ข้อดีของสิทธิ์ที่ไม่บังคับ
- ความปลอดภัยที่ดีขึ้น: ส่วนขยายจะทำงานโดยมีสิทธิ์น้อยลงเนื่องจากผู้ใช้เปิดใช้เฉพาะสิทธิ์ที่จําเป็นเท่านั้น
- ข้อมูลที่ดียิ่งขึ้นสำหรับผู้ใช้: ส่วนขยายสามารถอธิบายได้ว่าเหตุใดจึงต้องใช้สิทธิ์หนึ่งๆ เมื่อผู้ใช้เปิดใช้ฟีเจอร์ที่เกี่ยวข้อง
- การอัปเกรดที่ง่ายขึ้น: เมื่อคุณอัปเกรดส่วนขยาย Chrome จะไม่ปิดใช้ส่วนขยายนั้นสำหรับผู้ใช้หากการอัปเกรดเพิ่มสิทธิ์ที่ไม่บังคับแทนที่จะเป็นสิทธิ์ที่จำเป็น
ขั้นตอนที่ 2: ประกาศสิทธิ์ที่ไม่บังคับในไฟล์ Manifest
ประกาศสิทธิ์ที่ไม่บังคับในไฟล์ Manifest ของส่วนขยายด้วยคีย์ optional_permissions
โดยใช้รูปแบบเดียวกับช่องสิทธิ์ ดังนี้
{
"name": "My extension",
...
"optional_permissions": ["tabs"],
"optional_host_permissions": ["https://www.google.com/"],
...
}
หากต้องการขอโฮสต์ที่คุณค้นพบในช่วงรันไทม์เท่านั้น ให้ใส่ "https://*/*"
ในช่อง optional_host_permissions
ของส่วนขยาย ซึ่งช่วยให้คุณระบุต้นทางใดก็ได้ใน "Permissions.origins"
ตราบใดที่มีรูปแบบที่ตรงกัน
สิทธิ์ที่ไม่ได้ระบุไว้ว่าไม่บังคับ
สิทธิ์ส่วนขยาย Chrome ส่วนใหญ่สามารถระบุเป็น "ไม่บังคับ" โดยมีข้อยกเว้นต่อไปนี้
สิทธิ์ | คำอธิบาย |
---|---|
"debugger" |
API chrome.debugger ทำหน้าที่เป็นช่องทางการนำส่งสำรองสำหรับโปรโตคอลการแก้ไขข้อบกพร่องจากระยะไกลของ Chrome |
"declarativeNetRequest" |
ให้สิทธิ์เข้าถึง chrome.declarativeNetRequest API แก่ส่วนขยาย |
"devtools" |
อนุญาตให้ส่วนขยายขยายฟังก์ชันของ Chrome DevTools |
"geolocation" |
อนุญาตให้ส่วนขยายใช้ Geolocation API ของ HTML5 |
"mdns" |
ให้สิทธิ์เข้าถึง chrome.mdns API แก่ส่วนขยาย |
"proxy" |
ให้สิทธิ์เข้าถึง chrome.proxy API แก่ส่วนขยายเพื่อจัดการการตั้งค่าพร็อกซีของ Chrome |
"tts" |
chrome.tts API จะเล่นการอ่านออกเสียงข้อความ (TTS) ที่สังเคราะห์ |
"ttsEngine" |
chrome.ttsEngine API ใช้เครื่องมือการอ่านออกเสียงข้อความ (TTS) โดยใช้ส่วนขยาย |
"wallpaper" |
ChromeOS เท่านั้น ใช้ chrome.wallpaper API เพื่อเปลี่ยนวอลเปเปอร์ 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.
chrome.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()
chrome.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()
มักจะเพิ่มสิทธิ์กลับเข้าไปโดยไม่ได้แจ้งให้ผู้ใช้ทราบ
chrome.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
พร็อพเพอร์ตี้
-
ต้นกำเนิด
string[] ไม่บังคับ
รายการสิทธิ์ของโฮสต์ ซึ่งรวมถึงสิทธิ์ที่ระบุไว้ในคีย์
optional_permissions
หรือpermissions
ในไฟล์ Manifest และสิทธิ์ที่เชื่อมโยงกับสคริปต์เนื้อหา -
สิทธิ์
string[] ไม่บังคับ
รายการสิทธิ์ที่มีชื่อ (ไม่รวมโฮสต์หรือต้นทาง)
เมธอด
addSiteAccessRequest()
chrome.permissions.addSiteAccessRequest(
request: object,
callback?: function,
)
เพิ่มคําขอเข้าถึงเว็บไซต์ ระบบจะส่งสัญญาณคําขอไปยังผู้ใช้ก็ต่อเมื่อสามารถให้สิทธิ์เข้าถึงเว็บไซต์ในคําขอแก่ส่วนขยายได้ ระบบจะรีเซ็ตคำขอในการนําทางข้ามต้นทาง เมื่อยอมรับแล้ว สิทธิ์นี้จะให้สิทธิ์เข้าถึงต้นทางระดับบนสุดของเว็บไซต์อย่างต่อเนื่อง
พารามิเตอร์
-
ส่งคำขอ
ออบเจ็กต์
-
documentId
สตริง ไม่บังคับ
รหัสของเอกสารที่แสดงคำขอเข้าถึงเว็บไซต์ได้ ต้องเป็นเอกสารระดับบนสุดภายในแท็บ หากระบุไว้ คำขอจะแสดงในแท็บของเอกสารที่ระบุและจะถูกนำออกเมื่อเอกสารไปยังต้นทางใหม่ การเพิ่มคำขอใหม่จะลบล้างคำขอที่มีอยู่สำหรับ
tabId
ต้องระบุค่านี้หรือtabId
-
รูปแบบ
สตริง ไม่บังคับ
รูปแบบ URL ที่แสดงคําขอเข้าถึงเว็บไซต์ได้ หากระบุไว้ คำขอเข้าถึงเว็บไซต์จะแสดงใน URL ที่ตรงกับรูปแบบนี้เท่านั้น
-
tabId
ตัวเลข ไม่บังคับ
รหัสของแท็บที่แสดงคำขอเข้าถึงเว็บไซต์ได้ หากระบุไว้ คำขอจะแสดงในแท็บที่ระบุและจะถูกนำออกเมื่อแท็บไปยังต้นทางใหม่ การเพิ่มคำขอใหม่จะลบล้างคำขอที่มีอยู่สำหรับ
documentId
ต้องระบุค่านี้หรือdocumentId
-
-
Callback
ฟังก์ชัน ไม่บังคับ
พารามิเตอร์
callback
จะมีลักษณะดังนี้() => void
การคืนสินค้า
-
Promise<void>
ไฟล์ Manifest เวอร์ชัน 3 ขึ้นไปรองรับ Promise แต่ก็มีคอลแบ็กไว้เพื่อให้ใช้กับเวอร์ชันก่อนหน้าได้ คุณใช้ทั้ง 2 รูปแบบในการเรียกใช้ฟังก์ชันเดียวกันไม่ได้ พรอมต์จะได้รับการแก้ไขด้วยประเภทเดียวกันกับที่ส่งไปยังการเรียกกลับ
contains()
chrome.permissions.contains(
permissions: Permissions,
callback?: function,
)
ตรวจสอบว่าส่วนขยายมีสิทธิ์ที่ระบุหรือไม่
พารามิเตอร์
-
สิทธิ์
-
Callback
ฟังก์ชัน ไม่บังคับ
พารามิเตอร์
callback
จะมีลักษณะดังนี้(result: boolean) => void
-
ผลลัพธ์
บูลีน
จริงหากส่วนขยายมีสิทธิ์ที่ระบุ หากระบุแหล่งที่มาเป็นทั้งสิทธิ์ที่ไม่บังคับและรูปแบบการจับคู่สคริปต์เนื้อหา ระบบจะแสดงผลเป็น
false
เว้นแต่จะได้รับสิทธิ์ทั้ง 2 รายการ
-
การคืนสินค้า
-
Promise<boolean>
Chrome 96 ขึ้นไปไฟล์ Manifest เวอร์ชัน 3 ขึ้นไปรองรับ Promise แต่ก็มีคอลแบ็กไว้เพื่อให้ใช้กับเวอร์ชันก่อนหน้าได้ คุณใช้ทั้ง 2 รูปแบบในการเรียกใช้ฟังก์ชันเดียวกันไม่ได้ พรอมต์จะได้รับการแก้ไขด้วยประเภทเดียวกันกับที่ส่งไปยังการเรียกกลับ
getAll()
chrome.permissions.getAll(
callback?: function,
)
รับชุดสิทธิ์ปัจจุบันของส่วนขยาย
พารามิเตอร์
-
Callback
ฟังก์ชัน ไม่บังคับ
พารามิเตอร์
callback
จะมีลักษณะดังนี้(permissions: Permissions) => void
-
สิทธิ์
สิทธิ์ที่ใช้งานอยู่ของส่วนขยาย โปรดทราบว่าพร็อพเพอร์ตี้
origins
จะมีต้นทางที่ได้รับอนุญาตจากต้นทางที่ระบุไว้ในคีย์permissions
และoptional_permissions
ในไฟล์ Manifest และต้นทางที่เชื่อมโยงกับสคริปต์เนื้อหา
-
การคืนสินค้า
-
Promise<Permissions>
Chrome 96 ขึ้นไปไฟล์ Manifest เวอร์ชัน 3 ขึ้นไปรองรับ Promise แต่ก็มีคอลแบ็กไว้เพื่อให้ใช้กับเวอร์ชันก่อนหน้าได้ คุณใช้ทั้ง 2 รูปแบบในการเรียกใช้ฟังก์ชันเดียวกันไม่ได้ พรอมต์จะได้รับการแก้ไขด้วยประเภทเดียวกันกับที่ส่งไปยังการเรียกกลับ
remove()
chrome.permissions.remove(
permissions: Permissions,
callback?: function,
)
นำสิทธิ์เข้าถึงที่ระบุออก หากพบปัญหาในการนําสิทธิ์ออก ระบบจะตั้งค่า runtime.lastError
พารามิเตอร์
-
สิทธิ์
-
Callback
ฟังก์ชัน ไม่บังคับ
พารามิเตอร์
callback
จะมีลักษณะดังนี้(removed: boolean) => void
-
ลบแล้ว
บูลีน
เป็นจริงหากนำสิทธิ์ออกแล้ว
-
การคืนสินค้า
-
Promise<boolean>
Chrome 96 ขึ้นไปไฟล์ Manifest เวอร์ชัน 3 ขึ้นไปรองรับ Promise แต่ก็มีคอลแบ็กไว้เพื่อให้ใช้กับเวอร์ชันก่อนหน้าได้ คุณใช้ทั้ง 2 รูปแบบในการเรียกใช้ฟังก์ชันเดียวกันไม่ได้ พรอมต์จะได้รับการแก้ไขด้วยประเภทเดียวกันกับที่ส่งไปยังการเรียกกลับ
removeSiteAccessRequest()
chrome.permissions.removeSiteAccessRequest(
request: object,
callback?: function,
)
นำคำขอเข้าถึงเว็บไซต์ออก (หากมี)
พารามิเตอร์
-
ส่งคำขอ
ออบเจ็กต์
-
documentId
สตริง ไม่บังคับ
รหัสของเอกสารที่จะนำคำขอเข้าถึงเว็บไซต์ออก ต้องเป็นเอกสารระดับบนสุดภายในแท็บ ต้องระบุค่านี้หรือ
tabId
-
รูปแบบ
สตริง ไม่บังคับ
รูปแบบ URL ที่ระบบจะนำคำขอเข้าถึงเว็บไซต์ออก หากระบุ รูปแบบนี้ต้องตรงกับรูปแบบของคำขอเข้าถึงเว็บไซต์ที่มีอยู่ทุกประการ
-
tabId
ตัวเลข ไม่บังคับ
รหัสของแท็บที่จะนำคำขอเข้าถึงเว็บไซต์ออก ต้องระบุค่านี้หรือ
documentId
-
-
Callback
ฟังก์ชัน ไม่บังคับ
พารามิเตอร์
callback
จะมีลักษณะดังนี้() => void
การคืนสินค้า
-
Promise<void>
ไฟล์ Manifest เวอร์ชัน 3 ขึ้นไปรองรับ Promise แต่ก็มีคอลแบ็กไว้เพื่อให้ใช้กับเวอร์ชันก่อนหน้าได้ คุณใช้ทั้ง 2 รูปแบบในการเรียกใช้ฟังก์ชันเดียวกันไม่ได้ พรอมต์จะได้รับการแก้ไขด้วยประเภทเดียวกันกับที่ส่งไปยังการเรียกกลับ
request()
chrome.permissions.request(
permissions: Permissions,
callback?: function,
)
ขอสิทธิ์เข้าถึงที่ระบุ โดยแสดงข้อความแจ้งให้ผู้ใช้ทราบ หากจำเป็น สิทธิ์เหล่านี้ต้องกำหนดไว้ในช่อง optional_permissions
ของไฟล์ Manifest หรือเป็นสิทธิ์ที่จำเป็นซึ่งผู้ใช้ระงับไว้ ระบบจะไม่สนใจเส้นทางในรูปแบบต้นทาง คุณสามารถขอสิทธิ์ระดับล่างของต้นทางที่ไม่บังคับได้ เช่น หากระบุ *://*\/*
ในส่วน optional_permissions
ของไฟล์ Manifest คุณจะขอ http://example.com/
ได้ หากมีปัญหาในการขอสิทธิ์ ระบบจะตั้งค่าเป็น runtime.lastError
พารามิเตอร์
-
สิทธิ์
-
Callback
ฟังก์ชัน ไม่บังคับ
พารามิเตอร์
callback
จะมีลักษณะดังนี้(granted: boolean) => void
-
อนุญาต
บูลีน
จริงหากผู้ใช้ให้สิทธิ์ที่ระบุ
-
การคืนสินค้า
-
Promise<boolean>
Chrome 96 ขึ้นไปไฟล์ Manifest เวอร์ชัน 3 ขึ้นไปรองรับ Promise แต่ก็มีคอลแบ็กไว้เพื่อให้ใช้กับเวอร์ชันก่อนหน้าได้ คุณใช้ทั้ง 2 รูปแบบในการเรียกใช้ฟังก์ชันเดียวกันไม่ได้ พรอมต์จะได้รับการแก้ไขด้วยประเภทเดียวกันกับที่ส่งไปยังการเรียกกลับ
กิจกรรม
onAdded
chrome.permissions.onAdded.addListener(
callback: function,
)
เริ่มทํางานเมื่อส่วนขยายได้รับสิทธิ์ใหม่
พารามิเตอร์
-
Callback
ฟังก์ชัน
พารามิเตอร์
callback
จะมีลักษณะดังนี้(permissions: Permissions) => void
-
สิทธิ์
-
onRemoved
chrome.permissions.onRemoved.addListener(
callback: function,
)
เริ่มทํางานเมื่อนําสิทธิ์เข้าถึงออกจากส่วนขยายแล้ว
พารามิเตอร์
-
Callback
ฟังก์ชัน
พารามิเตอร์
callback
จะมีลักษณะดังนี้(permissions: Permissions) => void
-
สิทธิ์
-