Linux เป็นแพลตฟอร์มเดียวที่ผู้ใช้ Chrome ติดตั้งส่วนขยายที่โฮสต์นอก Chrome เว็บสโตร์ได้ บทความนี้อธิบายถึงวิธีสร้างแพ็กเกจ โฮสต์ และอัปเดตไฟล์ crx
จากเว็บเซิร์ฟเวอร์สำหรับวัตถุประสงค์ทั่วไป หากคุณเผยแพร่ส่วนขยายหรือธีมใน Chrome เว็บสโตร์เพียงอย่างเดียว โปรดปรึกษาการโฮสต์และการอัปเดตเว็บสโตร์
Package
ส่วนขยายและธีมจะแสดงเป็น .crx
ไฟล์ เมื่ออัปโหลดผ่านหน้าแดชบอร์ดสำหรับนักพัฒนาซอฟต์แวร์ Chrome หน้าแดชบอร์ดจะสร้างไฟล์ crx
โดยอัตโนมัติ หากเผยแพร่บนเซิร์ฟเวอร์ส่วนตัว คุณจะต้องสร้างไฟล์ crx
ในเครื่องหรือดาวน์โหลดจาก Chrome เว็บสโตร์
ดาวน์โหลด .crx จาก Chrome เว็บสโตร์
หากส่วนขยายโฮสต์อยู่ใน Chrome เว็บสโตร์ คุณจะดาวน์โหลดไฟล์ .crx
ได้จากหน้าแดชบอร์ดสำหรับนักพัฒนาซอฟต์แวร์ มองหาส่วนขยายใน "รายชื่อของคุณ" แล้วคลิก "ข้อมูลเพิ่มเติม" ในหน้าต่างป๊อปอัป ให้คลิกลิงก์ main.crx
สีน้ำเงินเพื่อดาวน์โหลด
ไฟล์ที่ดาวน์โหลดจะโฮสต์บนเซิร์ฟเวอร์ส่วนตัว วิธีนี้เป็นวิธีที่ปลอดภัยที่สุดในการโฮสต์ส่วนขยายภายในเครื่อง เนื่องจาก Chrome เว็บสโตร์จะรับรองเนื้อหาของส่วนขยาย ซึ่งจะช่วยตรวจจับการโจมตีและการปลอมแปลงที่อาจเกิดขึ้น
สร้างไฟล์ .crx ในเครื่อง
ระบบจะแปลงไดเรกทอรีส่วนขยายเป็น .crx
ไฟล์ในหน้าการจัดการส่วนขยาย ไปที่ chrome://extensions/
ในแถบอเนกประสงค์ หรือคลิกเมนู Chrome วางเคอร์เซอร์เหนือ "เครื่องมือเพิ่มเติม" แล้วเลือก "ส่วนขยาย"
ในหน้าการจัดการส่วนขยาย ให้เปิดใช้โหมดนักพัฒนาซอฟต์แวร์โดยคลิกสวิตช์เปิด/ปิดข้างโหมดนักพัฒนาซอฟต์แวร์ จากนั้นเลือกปุ่มแพ็คส่วนขยาย
ระบุเส้นทางไปยังโฟลเดอร์ของส่วนขยายในช่องไดเรกทอรีรากของส่วนขยาย จากนั้นคลิกปุ่มแพ็คส่วนขยาย ไม่ต้องสนใจช่องคีย์ส่วนตัวสำหรับแพ็กเกจครั้งแรก
Chrome จะสร้างไฟล์ 2 ไฟล์ ได้แก่ ไฟล์ .crx
และไฟล์ .pem
ซึ่งประกอบด้วยคีย์ส่วนตัวของส่วนขยาย
โปรดอย่าทำคีย์ส่วนตัวหาย เก็บไฟล์ .pem
ไว้เป็นความลับและดูแลให้ปลอดภัย โดยคุณจะต้องอัปเดตส่วนขยาย
อัปเดตแพ็กเกจ .crx
อัปเดตไฟล์ .crx
ของส่วนขยายโดยเพิ่มหมายเลขเวอร์ชันใน manifest.json
{
...
"version": "1.5",
...
}
}
{
...
"version": "1.6",
...
}
}
กลับไปที่หน้าการจัดการส่วนขยาย และคลิกปุ่มส่วนขยายแพ็ก ระบุเส้นทางไปยังไดเรกทอรีส่วนขยายและตำแหน่งของคีย์ส่วนตัว
หน้านี้จะระบุเส้นทางสำหรับส่วนขยายแพ็กเกจที่อัปเดตแล้ว
สร้างแพ็กเกจผ่านบรรทัดคำสั่ง
สร้างแพ็กเกจส่วนขยายในบรรทัดคำสั่งโดยเรียกใช้ chrome.exe
ใช้แฟล็ก --pack-extension
เพื่อระบุตำแหน่งโฟลเดอร์ของส่วนขยายและแฟล็ก --pack-extension-key
เพื่อระบุตำแหน่งไฟล์คีย์ส่วนตัวของส่วนขยาย
chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem
โฮสต์
เซิร์ฟเวอร์ที่โฮสต์ไฟล์ .crx
ต้องใช้ส่วนหัว HTTP ที่เหมาะสม เพื่ออนุญาตให้ผู้ใช้ติดตั้งส่วนขยายด้วยการคลิกลิงก์
Google Chrome จะถือว่าไฟล์สามารถติดตั้งได้ถ้าข้อใดข้อหนึ่งต่อไปนี้เป็นจริง
- ไฟล์มีประเภทเนื้อหา
application/x-chrome-extension
- คำต่อท้ายไฟล์คือ
.crx
และทั้ง 2 อย่างต่อไปนี้เป็นจริง- ไฟล์จะไม่ได้แสดงโดยมีส่วนหัว HTTP
X-Content-Type-Options: nosniff
- ไฟล์จะแสดงพร้อมกับเนื้อหาประเภทใดประเภทหนึ่งต่อไปนี้
- สตริงว่าง
"text/plain"
"application/octet-stream"
"unknown/unknown"
"application/unknown"
"\*/\*"
- ไฟล์จะไม่ได้แสดงโดยมีส่วนหัว HTTP
สาเหตุที่พบบ่อยที่สุดที่ทำให้จดจำไฟล์ที่ติดตั้งไม่ได้คือเซิร์ฟเวอร์ส่งส่วนหัว X-Content-Type-Options: nosniff
สาเหตุที่พบบ่อยที่สุดอันดับ 2 คือเซิร์ฟเวอร์ส่งประเภทเนื้อหาที่ไม่รู้จัก ซึ่งไม่มีอยู่ในรายการก่อนหน้านี้ ในการแก้ปัญหาส่วนหัว HTTP ให้เปลี่ยนการกำหนดค่าของเซิร์ฟเวอร์หรือลองโฮสต์ไฟล์ .crx
บนเซิร์ฟเวอร์อื่น
อัปเดต
เบราว์เซอร์จะตรวจสอบส่วนขยายที่ติดตั้งเพื่อหา URL อัปเดตทุกๆ 2-3 ชั่วโมง สำหรับแต่ละรายการ จะมีการส่งคำขอไปยัง URL นั้นเพื่อค้นหาไฟล์ XML ไฟล์ Manifest สำหรับอัปเดต
- เนื้อหาที่แสดงผลโดยการตรวจสอบการอัปเดตคือเอกสาร XML ไฟล์ Manifest สำหรับการอัปเดตที่แสดงส่วนขยายเวอร์ชันล่าสุด
หากไฟล์ Manifest ของการอัปเดตกล่าวถึงเวอร์ชันที่ใหม่กว่าเวอร์ชันที่ติดตั้ง เบราว์เซอร์จะดาวน์โหลดและติดตั้งเวอร์ชันใหม่ สำหรับการอัปเดตด้วยตนเอง ไฟล์ .crx
ใหม่จะต้องลงนามด้วยคีย์ส่วนตัวเดียวกันกับเวอร์ชันที่ติดตั้งอยู่ในปัจจุบัน
อัปเดต URL
ส่วนขยายที่โฮสต์บนเซิร์ฟเวอร์นอก Chrome เว็บสโตร์ต้องมีช่อง update_url
ในไฟล์ manifest.json
{
"name": "My extension",
...
"update_url": "https://myhost.com/mytestextension/updates.xml",
...
}
อัปเดตไฟล์ Manifest
ไฟล์ Manifest อัปเดตที่เซิร์ฟเวอร์แสดงผลควรเป็นเอกสาร XML
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
<updatecheck codebase='https://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
</app>
</gupdate>
รูปแบบ XML นี้ดึงมาจาก Omaha ซึ่งเป็นโครงสร้างพื้นฐานการอัปเดตของ Google ระบบส่วนขยายใช้แอตทริบิวต์ต่อไปนี้สำหรับองค์ประกอบ <app>
และ <updatecheck>
ของไฟล์ Manifest อัปเดต
- appid
- รหัสส่วนขยายจะสร้างขึ้นตามแฮชของคีย์สาธารณะตามที่อธิบายไว้ในแพ็กเกจ รหัสของส่วนขยายจะแสดงในหน้าการจัดการส่วนขยาย
- ฐานของโค้ด
- HTTPS URL ไปยังไฟล์
.crx
- เวอร์ชัน
- ไคลเอ็นต์ใช้เพื่อพิจารณาว่าควรดาวน์โหลดไฟล์
.crx
ที่ระบุไว้โดยcodebase
หรือไม่ ซึ่งควรตรงกับค่าของ "เวอร์ชัน" ในไฟล์manifest.json
ของไฟล์.crx
ไฟล์ XML ไฟล์ Manifest สำหรับการอัปเดตอาจมีข้อมูลเกี่ยวกับส่วนขยายหลายรายการโดยการรวมองค์ประกอบ <app>
หลายรายการไว้
การทดสอบ
ความถี่ในการตรวจหาการอัปเดตเริ่มต้นคือหลายชั่วโมง แต่คุณสามารถบังคับให้อัปเดตโดยใช้ปุ่มอัปเดตส่วนขยายเลยในหน้าการจัดการส่วนขยาย
การดำเนินการนี้จะเริ่มตรวจสอบส่วนขยายทั้งหมดที่ติดตั้ง
การใช้งานขั้นสูง: พารามิเตอร์คำขอ
กลไกการอัปเดตอัตโนมัติพื้นฐานได้รับการออกแบบมาให้ทำงานฝั่งเซิร์ฟเวอร์ได้อย่างง่ายดาย เพียงวางไฟล์ XML แบบคงที่ไปยังเว็บเซิร์ฟเวอร์ทั่วไป เช่น Apache และการอัปเดตไฟล์ XML นั้นเมื่อมีการเผยแพร่ส่วนขยายเวอร์ชันใหม่
นักพัฒนาซอฟต์แวร์ที่โฮสต์ส่วนขยายหลายรายการอาจตรวจสอบพารามิเตอร์คำขอ ซึ่งจะระบุรหัสและเวอร์ชันของส่วนขยายในคำขออัปเดต การใส่พารามิเตอร์เหล่านี้จะทำให้ส่วนขยายอัปเดตจาก URL เดียวกันที่ใช้โค้ดฝั่งเซิร์ฟเวอร์แบบไดนามิกแทนไฟล์ XML แบบคงที่ได้
รูปแบบของพารามิเตอร์คำขอคือ
?x=EXTENSION_DATA
โดย EXTENSION_DATA
เป็นสตริงที่เข้ารหัส URL ของรูปแบบ
id=EXTENSION_ID&v=EXTENSION_VERSION
เช่น มีส่วนขยาย 2 รายการชี้ไปยัง URL อัปเดตเดียวกัน (https://test.com/extension_updates.php
) ดังนี้
- ส่วนขยาย 1
- รหัส: "aaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- เวอร์ชัน: "1.1"
- ส่วนขยาย 2
- รหัส: "bbbbbbbbbbbbbbbbbbbbbbbbbb"
- เวอร์ชัน: "0.4"
คำขออัปเดตส่วนขยายแต่ละรายการจะ
https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1
และ
https://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
คุณแสดงส่วนขยายหลายรายการในคำขอเดียวสำหรับ URL อัปเดตที่ไม่ซ้ำกันแต่ละรายการได้ สำหรับตัวอย่างก่อนหน้านี้ หากผู้ใช้ติดตั้งส่วนขยายทั้ง 2 รายการ ระบบจะรวมคำขอ 2 รายการเป็นคำขอเดียว
https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
หากจำนวนของส่วนขยายที่ติดตั้งโดยใช้ URL อัปเดตเดียวกันมีมากจนทำให้ URL ของคำขอ GET ยาวเกินไป (มากกว่า 2,000 อักขระ) การตรวจสอบการอัปเดตจะออกคำขอ GET เพิ่มเติมตามที่จำเป็น
การใช้งานขั้นสูง: เวอร์ชันขั้นต่ำของเบราว์เซอร์
เมื่อมีการเพิ่ม API ลงในระบบส่วนขยายมากขึ้น อาจมีการเผยแพร่ส่วนขยายเวอร์ชันอัปเดตที่ใช้งานได้กับเบราว์เซอร์เวอร์ชันใหม่เท่านั้น แม้ว่า Google Chrome จะอัปเดตอัตโนมัติ แต่อาจต้องใช้เวลา 2-3 วันก่อนที่ฐานผู้ใช้ส่วนใหญ่จะอัปเดตเป็นรุ่นใหม่ เพิ่มแอตทริบิวต์ "prodversionmin" ลงในองค์ประกอบ <app>
ในการตอบกลับการอัปเดต เพื่อให้แน่ใจว่าการอัปเดตจะมีผลเฉพาะกับ Google Chrome ในเวอร์ชันที่เท่ากับหรือสูงกว่าเวอร์ชันที่เฉพาะเจาะจง
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
<updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' prodversionmin='3.0.193.0'/>
</app>
</gupdate>
ซึ่งจะช่วยให้แน่ใจได้ว่าผู้ใช้จะอัปเดตเป็นเวอร์ชัน 2 โดยอัตโนมัติก็ต่อเมื่อผู้ใช้ใช้ Google Chrome 3.0.193.0 หรือเวอร์ชันที่ใหม่กว่า