# รายละเอียดเชิงลึกเกี่ยวกับ 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
1

โดยคิวรีสตริงต่างๆ มีความหมายดังนี้

  • 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 =
1

# วิธีการสร้าง 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
1

บรรทัดที่สอง ระบุ Hostname ตัวอย่างเช่น

inox.qoder.byteark.com
1

บรรทัดที่สาม ระบุ Path ซึ่งจะขึ้นต้นด้วย / (กรณีที่มี / ติดกันสองตัว ต้องตัดให้เหลือเพียงตัวเดียว) ตัวอย่างเช่น

/video-objects/QDuxJm02TYqJ/playlist.m3u8
1

บรรทัดถัดๆ มา ระบุเงื่อนไขการจำกัดการเข้าใช้งานเพิ่มเติม ด้วยรูปแบบ key:value คู่ละ 1 บรรทัด โดยเรียงลำดับบรรทัดตาม key ตาม character code (หากไม่ต้องการระบุเงื่อนไขเพิ่มเติมให้ข้ามส่วนนี้ไป)

บรรทัดรองสุดท้าย ระบุ Unix Timestamp  (เขตเวลา GMT) ที่เป็นวันเวลาหมดอายุการใช้งาน Signed URL นี้ (ซึ่งจะต้องตรงกับค่าในพารามิเตอร์ x_ark_expires ในคิวรีสตริง) ตัวอย่างเช่น

1514764800
1

บรรทัดสุดท้าย ระบุ Access Secret ของ Access ID ที่จะใช้งานการสร้างลายเซ็น (ซึ่งระบุในพารามิเตอร์ x_ark_access_id ในคิวรีสตริง) ตัวอย่างเช่น

31sX5C0lcBiWuGPTzRszYvjxzzI3aCZjJi85ZyB7
1

เมื่อนำมาประกอบกันทั้งหมดจะได้ String to Sign ที่สมบูรณ์ดังนี้

GET
inox.qoder.byteark.com
/video-objects/QDuxJm02TYqJ/playlist.m3u8
1514764800
31sX5C0lcBiWuGPTzRszYvjxzzI3aCZjJi85ZyB7
1
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
1

# เงื่อนไขการจำกัดการเข้าใช้งานเพิ่มเติม

ท่านสามารถเลือกระบุเงื่อนไขการจำกัดการเข้าใช้งานเพิ่มเติมได้ โดยจะไม่ใช้เงื่อนไขเหล่านี้เลย, ใช้เงื่อนไขใดเงื่อนไขหนึ่ง, หรือใช้หลายเงื่อนไขพร้อมกันก็ได้

ในกรณีที่ใช้หลายเงื่อนไขพร้อมกัน ให้เรียงลำดับตามตัวอักษรของชื่อเงื่อนไข

# 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} ให้ตรงกันกับขั้นตอนแรก