Self-host สำหรับ Linux

Linux เป็นแพลตฟอร์มเดียวที่ผู้ใช้ Chrome ติดตั้งส่วนขยายที่โฮสต์นอก Chrome เว็บสโตร์ได้ บทความนี้อธิบายถึงวิธีสร้างแพ็กเกจ โฮสต์ และอัปเดตไฟล์ crx จากเว็บเซิร์ฟเวอร์สำหรับวัตถุประสงค์ทั่วไป หากคุณเผยแพร่ส่วนขยายหรือธีมใน Chrome เว็บสโตร์เพียงอย่างเดียว โปรดปรึกษาการโฮสต์และการอัปเดตเว็บสโตร์

Package

ส่วนขยายและธีมจะแสดงเป็น .crx ไฟล์ เมื่ออัปโหลดผ่านหน้าแดชบอร์ดสำหรับนักพัฒนาซอฟต์แวร์ Chrome หน้าแดชบอร์ดจะสร้างไฟล์ crx โดยอัตโนมัติ หากเผยแพร่บนเซิร์ฟเวอร์ส่วนตัว คุณจะต้องสร้างไฟล์ crx ในเครื่องหรือดาวน์โหลดจาก Chrome เว็บสโตร์

ดาวน์โหลด .crx จาก Chrome เว็บสโตร์

หากส่วนขยายโฮสต์อยู่ใน Chrome เว็บสโตร์ คุณจะดาวน์โหลดไฟล์ .crx ได้จากหน้าแดชบอร์ดสำหรับนักพัฒนาซอฟต์แวร์ มองหาส่วนขยายใน "รายชื่อของคุณ" แล้วคลิก "ข้อมูลเพิ่มเติม" ในหน้าต่างป๊อปอัป ให้คลิกลิงก์ main.crx สีน้ำเงินเพื่อดาวน์โหลด

ดาวน์โหลด .crx จากหน้าแดชบอร์ดสำหรับนักพัฒนาซอฟต์แวร์

ไฟล์ที่ดาวน์โหลดจะโฮสต์บนเซิร์ฟเวอร์ส่วนตัว วิธีนี้เป็นวิธีที่ปลอดภัยที่สุดในการโฮสต์ส่วนขยายภายในเครื่อง เนื่องจาก Chrome เว็บสโตร์จะรับรองเนื้อหาของส่วนขยาย ซึ่งจะช่วยตรวจจับการโจมตีและการปลอมแปลงที่อาจเกิดขึ้น

สร้างไฟล์ .crx ในเครื่อง

ระบบจะแปลงไดเรกทอรีส่วนขยายเป็น .crx ไฟล์ในหน้าการจัดการส่วนขยาย ไปที่ chrome://extensions/ ในแถบอเนกประสงค์ หรือคลิกเมนู Chrome วางเคอร์เซอร์เหนือ "เครื่องมือเพิ่มเติม" แล้วเลือก "ส่วนขยาย"

ในหน้าการจัดการส่วนขยาย ให้เปิดใช้โหมดนักพัฒนาซอฟต์แวร์โดยคลิกสวิตช์เปิด/ปิดข้างโหมดนักพัฒนาซอฟต์แวร์ จากนั้นเลือกปุ่มแพ็คส่วนขยาย

เลือกการตั้งค่าโหมดนักพัฒนาซอฟต์แวร์ แล้วคลิก Pack Extension

ระบุเส้นทางไปยังโฟลเดอร์ของส่วนขยายในช่องไดเรกทอรีรากของส่วนขยาย จากนั้นคลิกปุ่มแพ็คส่วนขยาย ไม่ต้องสนใจช่องคีย์ส่วนตัวสำหรับแพ็กเกจครั้งแรก

ระบุเส้นทางส่วนขยาย แล้วคลิกแพ็กส่วนขยาย

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"
    • "\*/\*"

สาเหตุที่พบบ่อยที่สุดที่ทำให้จดจำไฟล์ที่ติดตั้งไม่ได้คือเซิร์ฟเวอร์ส่งส่วนหัว X-Content-Type-Options: nosniff สาเหตุที่พบบ่อยที่สุดอันดับ 2 คือเซิร์ฟเวอร์ส่งประเภทเนื้อหาที่ไม่รู้จัก ซึ่งไม่มีอยู่ในรายการก่อนหน้านี้ ในการแก้ปัญหาส่วนหัว HTTP ให้เปลี่ยนการกำหนดค่าของเซิร์ฟเวอร์หรือลองโฮสต์ไฟล์ .crx บนเซิร์ฟเวอร์อื่น

อัปเดต

เบราว์เซอร์จะตรวจสอบส่วนขยายที่ติดตั้งเพื่อหา URL อัปเดตทุกๆ 2-3 ชั่วโมง สำหรับแต่ละรายการ จะมีการส่งคำขอไปยัง URL นั้นเพื่อค้นหาไฟล์ XML ไฟล์ Manifest สำหรับอัปเดต

  • เนื้อหาที่แสดงผลโดยการตรวจสอบการอัปเดตคือเอกสาร XML ไฟล์ Manifest สำหรับการอัปเดตที่แสดงส่วนขยายเวอร์ชันล่าสุด

หากไฟล์ Manifest ของการอัปเดตกล่าวถึงเวอร์ชันที่ใหม่กว่าเวอร์ชันที่ติดตั้ง เบราว์เซอร์จะดาวน์โหลดและติดตั้งเวอร์ชันใหม่ สำหรับการอัปเดตด้วยตนเอง ไฟล์ .crx ใหม่จะต้องลงนามด้วยคีย์ส่วนตัวเดียวกันกับเวอร์ชันที่ติดตั้งอยู่ในปัจจุบัน

หมายเหตุ: เพื่อรักษาความเป็นส่วนตัวของผู้ใช้ Google Chrome จะไม่ส่งส่วนหัวของคุกกี้พร้อมคำขอไฟล์ Manifest สำหรับการอัปเดตอัตโนมัติ และจะไม่สนใจส่วนหัว Set-Cookie ในการตอบกลับคำขอเหล่านั้น

อัปเดต 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 หรือเวอร์ชันที่ใหม่กว่า