ฉันกำลังพัฒนา REST API ที่ต้องมีการพิสูจน์ตัวตน เนื่องจากการพิสูจน์ตัวตนเกิดขึ้นผ่านบริการเว็บภายนอกผ่าน HTTP ฉันจึงให้เหตุผลว่าเราจะแจกจ่ายโทเค็นเพื่อหลีกเลี่ยงการเรียกใช้บริการการตรวจสอบสิทธิ์ซ้ำ ๆ ซึ่งนำฉันไปสู่คำถามแรกของฉันอย่างเรียบร้อย:
สิ่งนี้ดีไปกว่าการกำหนดให้ไคลเอนต์ใช้ HTTP Basic Auth ในแต่ละคำขอและแคชการโทรไปยังฝั่งเซิร์ฟเวอร์ของบริการตรวจสอบความถูกต้องหรือไม่?
โซลูชันการตรวจสอบสิทธิ์ขั้นพื้นฐานมีข้อดีตรงที่ไม่ต้องใช้การเดินทางไปกลับแบบเต็มรูปแบบไปยังเซิร์ฟเวอร์ก่อนที่คำขอเนื้อหาจะเริ่มได้ โทเค็นอาจมีความยืดหยุ่นในขอบเขตมากขึ้น (เช่นให้สิทธิ์เฉพาะทรัพยากรหรือการกระทำบางอย่างเท่านั้น) แต่ดูเหมือนว่าเหมาะสมกับบริบท OAuth มากกว่ากรณีการใช้งานที่ง่ายกว่าของฉัน
ปัจจุบันโทเค็นได้รับในลักษณะนี้:
curl -X POST localhost/token --data "api_key=81169d80...
&verifier=2f5ae51a...
×tamp=1234567
&user=foo
&pass=bar"
api_key
, timestamp
และverifier
ถูกต้องตามคำขอทั้งหมด "ตัวยืนยัน" ส่งคืนโดย:
sha1(timestamp + api_key + shared_secret)
ความตั้งใจของฉันคืออนุญาตให้โทรจากบุคคลที่รู้จักเท่านั้นและเพื่อป้องกันไม่ให้มีการโทรซ้ำแบบคำต่อคำ
ดีพอหรือยัง? Underkill? Overkill?
ด้วยโทเค็นในมือลูกค้าสามารถรับทรัพยากร:
curl localhost/posts?api_key=81169d80...
&verifier=81169d80...
&token=9fUyas64...
×tamp=1234567
สำหรับการเรียกที่ง่ายที่สุดสิ่งนี้ดูเหมือนเป็นการใช้คำฟุ่มเฟือยอย่างน่ากลัว เมื่อพิจารณาถึงความshared_secret
ประสงค์ที่จะฝังอยู่ใน (อย่างน้อยที่สุด) แอปพลิเคชัน iOS ซึ่งฉันคิดว่ามันสามารถแยกออกได้นี่เป็นการเสนออะไรที่นอกเหนือไปจากความปลอดภัยที่ผิดพลาดหรือไม่?