คีย์ API เทียบกับการตรวจสอบสิทธิ์ HTTP เทียบกับ OAuth ใน RESTful API


101

ฉันกำลังสร้าง RESTful API สำหรับหนึ่งในแอปพลิเคชันที่ฉันดูแลอยู่ ขณะนี้เรากำลังมองหาสิ่งต่างๆที่ต้องการการเข้าถึงและความปลอดภัยที่มีการควบคุมมากขึ้น ในขณะที่ศึกษาวิธีการรักษาความปลอดภัย API ฉันพบความคิดเห็นที่แตกต่างกันเล็กน้อยเกี่ยวกับรูปแบบที่จะใช้ ฉันเคยเห็นแหล่งข้อมูลบางแห่งบอกว่า HTTP-Auth เป็นวิธีที่จะไปในขณะที่คนอื่น ๆ ชอบคีย์ API และแม้แต่คนอื่น ๆ (รวมถึงคำถามที่ฉันพบที่นี่ใน SO) สาบานด้วย OAuth

จากนั้นคนที่ชอบพูดว่าคีย์ API บอกว่า OAuth ออกแบบมาสำหรับแอปพลิเคชันที่เข้าถึงในนามของผู้ใช้ (ตามที่ฉันเข้าใจเช่นการลงชื่อเข้าใช้ไซต์ที่ไม่ใช่ Facebook โดยใช้บัญชี Facebook ของคุณ) และไม่ใช่สำหรับผู้ใช้ที่เข้าถึงทรัพยากรโดยตรงบนไซต์ที่พวกเขาสมัครไว้โดยเฉพาะ (เช่นไคลเอนต์ Twitter อย่างเป็นทางการที่เข้าถึงเซิร์ฟเวอร์ Twitter) อย่างไรก็ตามคำแนะนำสำหรับ OAuth ดูเหมือนจะเป็นความต้องการขั้นพื้นฐานที่สุดในการตรวจสอบสิทธิ์

คำถามของฉันคือ - สมมติว่ามันทำผ่าน HTTPS ทั้งหมดแล้วความแตกต่างในทางปฏิบัติระหว่างทั้งสามมีอะไรบ้าง? เมื่อใดที่ควรพิจารณาคนอื่น ๆ


คุณจบลงด้วยอะไร?
เออร์วิน

@Irwin - ฉันถามคำถามนี้เมื่อไม่นานมานี้และได้ย้ายจากโครงการที่ต้องการมัน แต่ฉันลงเอยด้วยการใช้คีย์ API และรหัสผ่านที่สร้างขึ้น (ที่ผู้ใช้ไม่เคยเห็น) ซึ่งส่งโดยใช้การตรวจสอบสิทธิ์ HTTP
Shauna

คำตอบ:


67

ขึ้นอยู่กับความต้องการของคุณ คุณต้องการ:

  • ข้อมูลประจำตัว - ใครอ้างว่าเป็นผู้ร้องขอ API
  • การรับรองความถูกต้อง - พวกเขาเป็นคนที่พูดจริงหรือไม่?
  • การอนุญาต - พวกเขาได้รับอนุญาตให้ทำในสิ่งที่พยายามทำหรือไม่?

หรือทั้งสาม?

หากคุณต้องการเพียงระบุผู้โทรเพื่อติดตามปริมาณหรือจำนวนการเรียก API ให้ใช้คีย์ API แบบธรรมดา โปรดทราบว่าหากผู้ใช้ที่คุณออกคีย์ API แชร์กับคนอื่นพวกเขาก็จะเรียก API ของคุณได้เช่นกัน

แต่ถ้าคุณต้องการการอนุญาตเช่นกันนั่นคือคุณต้องให้สิทธิ์เข้าถึงเฉพาะทรัพยากรบางอย่างตามผู้เรียก API จากนั้นใช้ oAuth

นี่คือคำอธิบายที่ดี: http://www.srimax.com/index.php/do-you-need-api-keys-api-identity-vs-authorization/


ด้วย "ทรัพยากรบางอย่าง" คุณหมายถึง "การเรียก API บางรายการ" หรือ "ระเบียนฐานข้อมูลบางรายการ" หรือทั้งสองอย่าง
Magne

ส่วนใหญ่บันทึก DB (หรือสิ่งใดก็ตามที่เปิดเผยสถานะที่ได้รับการป้องกันหรือแก้ไขสถานะ) แต่อาจเป็นคุณสมบัติพิเศษ (เช่นการเรียกใช้อัลกอริทึมบนคลาวด์) ซึ่งไม่ได้เปลี่ยนแปลงอะไรบนฐานข้อมูล แต่ใช้ทรัพยากรระบบและควรมีให้เฉพาะบุคคลที่ได้รับอนุญาตเท่านั้น
Sid

@Sid ฉันกำลังทำงานกับแอพที่ใช้ OAuth สำหรับการลงทะเบียนผู้ใช้ที่ลงทะเบียนกับ Facebook หรือ LinkedIn นอกจากนี้เรากำลังเปิด API ของเราสำหรับบริการอื่น ๆ เพื่อจัดการข้อมูล ในกรณีนี้คุณจะแนะนำ OAuth สำหรับการตรวจสอบสิทธิ์ผู้ใช้และคีย์ API หรือชื่อผู้ใช้และรหัสผ่าน (เช่นในบทความที่คุณเชื่อมโยง) สำหรับบริการที่เข้าถึง API หรือไม่ คีย์ OAuth และ api ใช้เพื่อวัตถุประสงค์ที่ต่างกันใช่ไหม
Tom Doe

@TomDoe สวัสดีทอม - ใช่นั่นเข้าท่า คุณอาจต้องการใช้ OAuth2 ตอนนี้ หากเซิร์ฟเวอร์ของคุณอยู่ใน Python (Django หรือ Flask) โปรดดูที่github.com/omab/python-social-auth
Sid

ฉันไม่เข้าใจว่าคีย์ API ไม่สามารถให้สามสิ่งนี้ได้อย่างไร ข้อมูลประจำตัวและการรับรองความถูกต้องขึ้นอยู่กับ "คุณรู้ความลับเฉพาะหรือไม่" (เว้นแต่คุณจะแนะนำ 2FA ซึ่งเป็นหัวข้อแยกต่างหาก) ถ้าฉันให้รหัส API ที่ยาวมากของ User 5 นั่นเป็นการอ้างสิทธิ์และพิสูจน์ว่าฉันเป็นผู้ใช้ 5 อย่างน้อยก็ชื่อผู้ใช้ / รหัสผ่านด้วย และไม่มีเหตุผลว่าทำไมจึงไม่สามารถกำหนดสิทธิ์ที่แตกต่างกันให้กับคีย์ API ที่แตกต่างกันได้ ขวา? ฉันพลาดอะไรไปที่นี่?
Nathan Long

3

คีย์ API หรือแม้แต่โทเค็นจัดอยู่ในประเภทของกลไกการพิสูจน์ตัวตนและการอนุญาตโดยตรงเนื่องจากให้สิทธิ์เข้าถึงทรัพยากรที่เปิดเผยของ REST API กลไกโดยตรงดังกล่าวสามารถใช้ในกรณีการใช้การมอบหมาย

ในการเข้าถึงทรัพยากรหรือชุดของทรัพยากรที่เปิดเผยโดยจุดสิ้นสุด REST จำเป็นต้องตรวจสอบสิทธิ์ของผู้ร้องขอตามข้อมูลประจำตัว ขั้นตอนแรกของเวิร์กโฟลว์คือการยืนยันตัวตนโดยการพิสูจน์ตัวตนตามคำขอ ขั้นตอนต่อเนื่องคือการตรวจสอบข้อมูลประจำตัวกับชุดของกฎที่กำหนดไว้เพื่ออนุญาตระดับการเข้าถึง (เช่นอ่านเขียนหรืออ่าน / เขียน) เมื่อขั้นตอนดังกล่าวบรรลุผลข้อกังวลเพิ่มเติมโดยทั่วไปคืออัตราการร้องขอที่อนุญาตซึ่งหมายถึงจำนวนคำขอต่อวินาทีที่ผู้ร้องขอได้รับอนุญาตให้ดำเนินการต่อทรัพยากรที่กำหนด

OAuth (Open Authorization)เป็นโปรโตคอลมาตรฐานสำหรับการเข้าถึงที่ได้รับมอบหมายซึ่ง บริษัท อินเทอร์เน็ตรายใหญ่มักใช้เพื่อให้สิทธิ์การเข้าถึงโดยไม่ต้องให้รหัสผ่าน ตามที่ชัดเจน OAuth เป็นโปรโตคอลที่ตอบสนองข้อกังวลดังกล่าวข้างต้น: การพิสูจน์ตัวตนและการอนุญาตโดยให้สิทธิ์เข้าถึงทรัพยากรเซิร์ฟเวอร์ที่ได้รับมอบหมายอย่างปลอดภัยในนามของเจ้าของทรัพยากร มันขึ้นอยู่กับกลไกการเข้าถึงโทเค็นซึ่งอนุญาตให้บุคคลที่สามสามารถเข้าถึงทรัพยากรที่จัดการโดยเซิร์ฟเวอร์ในนามของเจ้าของทรัพยากร ตัวอย่างเช่น ServiceX ต้องการเข้าถึงบัญชี Google ของ John Smith ในนามของ John เมื่อ John ได้มอบอำนาจให้คณะผู้แทน จากนั้น ServiceX จะออกโทเค็นตามเวลาเพื่อเข้าถึงรายละเอียดบัญชี Google ซึ่งมีโอกาสมากในการเข้าถึงแบบอ่านเท่านั้น

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

สรุปในความเป็นจริงไม่มีความแตกต่างอย่างแท้จริงระหว่างกลไกการพิสูจน์ตัวตนและการอนุญาตแบบดั้งเดิมและเวอร์ชันที่ใช้คีย์ / โทเค็น กระบวนทัศน์แตกต่างกันเล็กน้อย: แทนที่จะใช้ข้อมูลประจำตัวซ้ำในแต่ละปฏิสัมพันธ์ระหว่างไคลเอนต์และเซิร์ฟเวอร์จะใช้คีย์ / โทเค็นสนับสนุนซึ่งทำให้ประสบการณ์การโต้ตอบโดยรวมราบรื่นขึ้นและมีความปลอดภัยมากขึ้น (โดยปกติจะเป็นไปตามมาตรฐานJWT , คีย์และ โทเค็นได้รับการเซ็นชื่อแบบดิจิทัลโดยเซิร์ฟเวอร์เพื่อหลีกเลี่ยงการประดิษฐ์)

  • การพิสูจน์ตัวตนโดยตรงและการอนุญาต : โปรโตคอลที่ใช้คีย์เป็นตัวแปรของเวอร์ชันที่ใช้ข้อมูลรับรองแบบเดิม
  • การรับรองความถูกต้องและการให้สิทธิ์ที่ได้รับมอบหมาย : เช่นโปรโตคอลที่ใช้ OAuth ซึ่งจะใช้โทเค็นอีกครั้งเป็นเวอร์ชันที่อิงตามข้อมูลรับรอง (เป้าหมายโดยรวมจะไม่เปิดเผยรหัสผ่านให้กับบุคคลที่สาม)

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.