# รายละเอียดเชิงลึกเกี่ยวกับ ByteArk Signed URL v2
# Signed URL สามารถใช้ป้องกันการใช้งานลิงก์โดยไม่ได้รับอนุญาตได้อย่างไร
Signed URL เป็นวิธีการสร้าง URL ที่ผู้ใช้ทั่วไปจะสามารถสร้างให้ถูกต้องได้ยาก โดยอาศัยองค์ประกอบดังนี้
- ในขั้นตอนการสร้าง URL จะต้องใช้องค์ประกอบลับ (secret) ที่มีเพียงระบบของท่าน และระบบของ ByteArk ที่ทราบร่วมกัน
- URL ถูกสร้างขึ้นด้วยกระบวนการเข้ารหัสทางเดียว (One-way encryption) ไม่สามารถถอดกลับเพื่อหา secret ที่ใช้ได้
- URL ที่สร้างขึ้นจะหมดอายุและใช้งานไม่ได้ เมื่อพ้นช่วงเวลาที่กำหนด
ท่านอาจเคยพบเห็น Signed URL ในบริการ Cloud service อื่นๆ ที่ใช้หลักการเดียวกันนี้ โดยอาจมีชื่อเรียกแตกต่างกันไป เช่น Presigned URL ของ Amazon AWS S3/Cloudfront, Signed URL ของ Google Cloud Storage เป็นต้น
# วิธีการสร้าง Signed URL เบื้องต้น
Signed URL จะประกอบไปด้วยส่วนประกอบเบื้องต้นดังนี้
http://example.byteark.com/path/to/target?x_ark_access_id=ACCESS_KEY_ID&x_ark_auth_type=ark-v2&x_ark_expires=EXPIRES_TIMESTAMP&x_ark_signature=CALCULATED_SIGNATURE
โดยคิวรีสตริงต่างๆ มีความหมายดังนี้
- x_ark_access_id คือ Access ID ที่มีสิทธิ์เข้าถึง URL นี้
- x_ark_auth_type คือวิธีการสร้าง Signed URL ในที่นี้ให้ระบุเป็น ark-v2
- x_ark_expires คือ Unix Timestamp (เขตเวลา GMT) ที่ระบุเวลาหมดอายุการใช้งาน Signed URL นี้ โดยทั่วไปมักระบุค่านี้ให้อยู่ในช่วง 5 นาที - 24 ชั่วโมงนับจากวันเวลาปัจจุบัน
- x_ark_signature คือลายเซ็นของ URL ที่คำนวณจากนำส่วนต่างๆ ของ Request มาเข้ารหัสด้วยวิธีการลับที่เฉพาะสำหรับผู้ที่มี Access ID และ Access Secret เท่านั้นที่สามารถทำได้ เพื่อให้มั่นใจว่า Signed URL นี้ถูกสร้างจากเจ้าของบริการตัวจริง ไม่มีการแก้ไขใดๆ (ดูวิธีการคำนวณ Signature ในหัวข้อ วิธีการคำนวณ Signature)
หากมีการระบุเงื่อนไขการจำกัดการเข้าใช้งานเพิ่มเติม ท่านอาจต้องระบุคิวรีสตริงอื่นเพิ่มเติม (ดูเพิ่มเติมในหัวข้อ การเงื่อนไขการจำกัดการเข้าใช้งานเพิ่มเติม)
# วิธีการคำนวณ Signature
Signature ของ Signed URL คือค่า MD5 ของ String to Sign ซึ่งเป็นสตริงความยาว 5 บรรทัดขึ้นไป ที่เกิดจากการนำส่วนต่างๆ ของรีเควสท์มาประกอบกัน โดยคั่นระหว่างบรรทัดด้วย Newline Character (\n
) เท่านั้น
ทั้งนี้ ค่า Signature จะต้องสร้างภายใต้เงื่อนไขต่อไปนี้
- การคำนวณ MD5 จะต้องเป็นการคำนวณ MD5 แบบ Binary Mode (แปลง String to Sign เป็น binary ก่อนเข้ารหัส MD5)
- การแปลงผลลัพท์จาก MD5 เป็นสตริง จะแปลงให้อยู่ในรูปแบบ Base64 แบบ base64url (opens new window) (Base64 ที่แทนค่า
+
ด้วย-
, แทนค่า/
ด้วย_
, ตัด=
ออก) เพื่อให้สามารถใส่ในคิวรีสตริงได้
หากเทียบกับการสร้าง Signature ด้วยคำสั่ง openssl จะตรงกับคำสั่งต่อไปนี้
echo -n 'string-to-sign' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
# วิธีการสร้าง String to Sign
วิธีการสร้าง String to Sign มีดังนี้
# สถานการณ์สมมติ
- ในตัวอย่างต่อไปนี้จะสมมติว่าต้องการสร้าง Signed URL สำหรับ http://inox.qoder.byteark.com/video-objects/QDuxJm02TYqJ/playlist.m3u8
- เพื่อให้เข้าใช้งานได้ถึงวันที่ 1 มกราคม 2018 เวลา 00:00 (Unix Timestamp:
1514764800
) - โดยมี Access ID เป็น
2Aj6Wkge4hi1ZYLp0DBG
- และ Access Secret เป็น
31sX5C0lcBiWuGPTzRszYvjxzzI3aCZjJi85ZyB7
# วิธีการสร้างตามขั้นตอน
บรรทัดแรก ระบุ HTTP Method ซึ่งเป็นตัวพิมพ์ใหญ่ทั้งหมด (สำหรับการแสดงเนื้อหาบนเว็บเบราว์เซอร์หรือแอพลิเคชนัท่ัวไป มักจะเป็นเมธอด GET) ตัวอย่างเช่น
GET
บรรทัดที่สอง ระบุ Hostname ตัวอย่างเช่น
inox.qoder.byteark.com
บรรทัดที่สาม ระบุ Path ซึ่งจะขึ้นต้นด้วย / (กรณีที่มี / ติดกันสองตัว ต้องตัดให้เหลือเพียงตัวเดียว) ตัวอย่างเช่น
/video-objects/QDuxJm02TYqJ/playlist.m3u8
บรรทัดถัดๆ มา ระบุเงื่อนไขการจำกัดการเข้าใช้งานเพิ่มเติม ด้วยรูปแบบ key:value คู่ละ 1 บรรทัด โดยเรียงลำดับบรรทัดตาม key ตาม character code (หากไม่ต้องการระบุเงื่อนไขเพิ่มเติมให้ข้ามส่วนนี้ไป)
บรรทัดรองสุดท้าย ระบุ Unix Timestamp (เขตเวลา GMT) ที่เป็นวันเวลาหมดอายุการใช้งาน Signed URL นี้ (ซึ่งจะต้องตรงกับค่าในพารามิเตอร์ x_ark_expires
ในคิวรีสตริง) ตัวอย่างเช่น
1514764800
บรรทัดสุดท้าย ระบุ Access Secret ของ Access ID ที่จะใช้งานการสร้างลายเซ็น (ซึ่งระบุในพารามิเตอร์ x_ark_access_id
ในคิวรีสตริง) ตัวอย่างเช่น
31sX5C0lcBiWuGPTzRszYvjxzzI3aCZjJi85ZyB7
เมื่อนำมาประกอบกันทั้งหมดจะได้ String to Sign ที่สมบูรณ์ดังนี้
GET
inox.qoder.byteark.com
/video-objects/QDuxJm02TYqJ/playlist.m3u8
1514764800
31sX5C0lcBiWuGPTzRszYvjxzzI3aCZjJi85ZyB7
2
3
4
5
เมื่อนำ String to Sign ดังกล่าวไปเข้ารหัสด้วยฟังก์ชัน md5 จะได้ Signature เป็น Siy3bVmEiAvZk1R4tLhHpg ดังนั้น Signed URL ที่สมบูรณ์และนำไปใช้งานได้จึงเป็นดังนี้
http://inox.qoder.s3.byteark.com/video-objects/QDuxJm02TYqJ/playlist.m3u8?x_ark_access_id=2Aj6Wkge4hi1ZYLp0DBG&x_ark_auth_type=ark-v2&x_ark_expires=1514764800&x_ark_signature=Siy3bVmEiAvZk1R4tLhHpg
# เงื่อนไขการจำกัดการเข้าใช้งานเพิ่มเติม
ท่านสามารถเลือกระบุเงื่อนไขการจำกัดการเข้าใช้งานเพิ่มเติมได้ โดยจะไม่ใช้เงื่อนไขเหล่านี้เลย, ใช้เงื่อนไขใดเงื่อนไขหนึ่ง, หรือใช้หลายเงื่อนไขพร้อมกันก็ได้
ในกรณีที่ใช้หลายเงื่อนไขพร้อมกัน ให้เรียงลำดับตามตัวอักษรของชื่อเงื่อนไข
# User Agent
ท่านสามารถกำหนดให้ URL ได้ใช้งานได้เมื่อถูกเรียกจาก User Agent ที่ระบุเท่านั้น โดย
- เพิ่มคิวรีสตริง
x_ark_user_agent=1
ใน URL - เพิ่ม
user_agent:{ALLOWED_USER_AGENT}
ในส่วนเงื่อนไขการจำกัดการเข้าใช้งานเพิ่มเติมของ String to Signed (ระบุ{ALLOWED_USER_AGENT}
ด้วย User Agent ที่ต้องการอนุญาต)
WARNING
หากใช้ Signed URL กับตัวเล่นวิดีโอบางตัว ตัวเล่นวิดีโอนั้นอาจเปลี่ยน User Agent เป็นค่าอื่นได้ ซึ่งจะส่งผลให้วิดีโอเล่นไม่ได้เนื่องจาก Signature ไม่ถูกต้อง
# Path Prefix
ท่านสามารถสร้าง Signature เดียวเพื่อใช้ร่วมกันสำหรับ URL ที่มีพาธขึ้นต้นตรงกันทั้งหมดได้ เพื่อประหยัดเวลาในการสร้าง Signed URL ที่มีแพทเทิร์นคล้ายคลึงกันได้
ตัวอย่างเช่น ท่านสามารถสร้าง Signature เดียวเพื่อใช้กับ URL 3 ลิงก์นี้ได้ โดยการ sign ด้วย path prefix /video-objects/QDuxJm02TYqJ/
http://inox.qoder.byteark.com/video-objects/QDuxJm02TYqJ/playlist.m3u8
http://inox.qoder.byteark.com/video-objects/QDuxJm02TYqJ/hls/720p/prog_index.m3u8
- URL อื่นที่ขึ้นต้นด้วย http://inox.qoder.byteark.com/video-objects/QDuxJm02TYqJ/
โดยแก้ไขการสร้าง signed URL เพิ่มเติมตามขั้นตอนดังนี้
- เพิ่มคิวรีสตริง
x_ark_path_prefix={ALLOWED_PATH_PREFIX}
ใน URL โดยแทนค่า{ALLOWED_PATH_PREFIX}
ด้วยพาธที่ต้องการใช้ขึ้นต้นร่วมกัน - เปลี่ยนพาธที่ใช้สร้าง String to Sign ในบรรทัดที่สามให้เป็นพาธเดียวกับที่ระบุที่
{ALLOWED_PATH_PREFIX}
แทนที่จะใช้พาธเต็มตามปกติ
ตัวอย่าง
จากตัวอย่างข้างต้น
{ALLOWED_PATH_PREFIX}
คือ/video-objects/QDuxJm02TYqJ/
- จึงต้องเพิ่มคิวรีสตริง:
x_ark_path_prefix=%2Fvideo-objects%2FQDuxJm02TYqJ%2F
- และ ต้องแก้ไขบรรทัดที่สามของ String to Sign ให้ใ้ชพาธ
/video-objects/QDuxJm02TYqJ/
# Geo Allow / Geo Block
ท่านสามารถเลือกระบุประเทศที่อนุญาต หรือไม่อนุญาตให้เรียก URL ดังกล่าวได้ โดย
- เพิ่มคิวรีสตริง
x_ark_geo_allow={COUNTRY_CODES}
หรือx_ark_geo_block={COUNTRY_CODES}
ใน URL โดยที่{COUNTRY_CODES}
ให้ระบุรหัสประเทศ 2 ตัวอักษรตามมาตรฐาน ISO 3166-1 alpha-2 (opens new window) หากต้องการระบุหลายประเทศให้คั่นด้วย , - เพิ่ม
geo_allow:{COUNTRY_CODES}
หรือgeo_block:{COUNTRY_CODES}
ในส่วนเงื่อนไขการจำกัดการเข้าใช้งานเพิ่มเติมของ String to Signed โดยระบุ{COUNTRY_CODES}
ให้ตรงกันกับขั้นตอนแรก