ภาพรวม
ฉันต้องการสร้าง API (REST) สำหรับแอปพลิเคชันของฉัน วัตถุประสงค์เริ่มต้น / หลักจะใช้เพื่อการบริโภคโดยแอพมือถือ (iPhone, Android, Symbian และอื่น ๆ ) ฉันได้ดูกลไกที่แตกต่างกันสำหรับการรับรองความถูกต้องและการอนุญาตสำหรับ API บนเว็บ (โดยศึกษาการใช้งานอื่น ๆ ) ฉันมีหัวของฉันห่อหุ้มแนวคิดพื้นฐานส่วนใหญ่ แต่ฉันยังคงมองหาคำแนะนำในบางพื้นที่ สิ่งสุดท้ายที่ฉันต้องการทำคือสร้างวงล้อใหม่ แต่ฉันไม่พบวิธีแก้ปัญหามาตรฐานใด ๆ ที่เหมาะกับเกณฑ์ของฉัน (แต่เกณฑ์ของฉันถูกเข้าใจผิด นอกจากนี้ฉันต้องการให้ API เหมือนกันสำหรับทุกแพลตฟอร์ม / แอปพลิเคชันที่ใช้งาน
oAuth
ฉันจะไปข้างหน้าและคัดค้าน oAuth เนื่องจากฉันรู้ว่าน่าจะเป็นทางออกแรกที่เสนอ สำหรับแอปพลิเคชันมือถือ (หรือโดยเฉพาะที่ไม่ใช่เว็บแอปพลิเคชัน) ดูเหมือนว่าผิดที่จะออกจากแอปพลิเคชัน (ไปที่เว็บเบราว์เซอร์) สำหรับการตรวจสอบสิทธิ์ นอกจากนี้ไม่มีทาง (ฉันรู้) สำหรับเบราว์เซอร์ที่จะส่งกลับไปที่แอปพลิเคชัน (โดยเฉพาะข้ามแพลตฟอร์ม) ฉันรู้ว่ามีแอพสองตัวที่ทำเช่นนั้น แต่มันก็รู้สึกผิดและหยุดพักในแอปพลิเคชัน UX
ความต้องการ
- ผู้ใช้ป้อนชื่อผู้ใช้ / รหัสผ่านลงในแอปพลิเคชัน
- การเรียก API ทุกครั้งจะมีการระบุโดยแอปพลิเคชันการโทร
- ค่าโสหุ้ยถูกเก็บไว้ให้น้อยที่สุดและการตรวจสอบสิทธิ์นั้นใช้งานง่ายสำหรับนักพัฒนา
- กลไกมีความปลอดภัยสำหรับผู้ใช้ปลายทาง (ไม่เปิดเผยข้อมูลการเข้าสู่ระบบของผู้ใช้) รวมถึงผู้พัฒนา (ไม่เปิดเผยข้อมูลรับรองแอปพลิเคชัน)
- หากเป็นไปได้ไม่จำเป็นต้องมี https (ไม่ได้หมายความว่าเป็นข้อกำหนดที่ยาก)
ความคิดปัจจุบันของฉันเกี่ยวกับการนำไปใช้
นักพัฒนาภายนอกจะขอบัญชี API พวกเขาจะได้รับ apikey และ apisecret ทุกคำขอจะต้องมีอย่างน้อยสามพารามิเตอร์
- apikey - มอบให้กับผู้พัฒนาที่ลงทะเบียน
- timestamp - เพิ่มเป็นสองเท่าของตัวระบุที่ไม่ซ้ำกันสำหรับแต่ละข้อความสำหรับ apikey ที่กำหนด
- hash - แฮชของการประทับเวลา + apisecret
apikey จำเป็นต้องระบุแอปพลิเคชันที่ออกคำขอ การประทับเวลาทำหน้าที่คล้ายกับ oauth_nonce และหลีกเลี่ยง / บรรเทาการโจมตีซ้ำ แฮชทำให้แน่ใจว่าคำขอนั้นออกจริงจากเจ้าของ apikey ที่ให้ไว้
สำหรับคำขอที่ได้รับการรับรองความถูกต้อง (คำขอที่ทำในนามของผู้ใช้) ฉันยังไม่แน่ใจว่าจะไปกับเส้นทาง access_token หรือชื่อผู้ใช้และคำสั่งผสมแฮชของรหัสผ่าน ไม่ว่าจะด้วยวิธีใดในบางกรณีจำเป็นต้องใช้คอมโบ / ชื่อผู้ใช้ / รหัสผ่าน ดังนั้นเมื่อมีการแฮชข้อมูลหลายชิ้น (apikey, apisecret, timestamp) + รหัสผ่านจะถูกใช้ ฉันชอบความคิดเห็นเกี่ยวกับเรื่องนี้ FYI พวกเขาจะต้องแฮรหัสผ่านก่อนเพราะฉันจะไม่เก็บรหัสผ่านในระบบของฉันโดยไม่ต้องแฮช
ข้อสรุป
FYI, นี่ไม่ใช่คำขอสำหรับวิธีการสร้าง / โครงสร้าง API โดยทั่วไปเท่านั้นวิธีจัดการการรับรองความถูกต้องและการอนุญาตจากภายในแอปพลิเคชันเท่านั้น
คำถามสุ่ม / คำถามโบนัส
สำหรับ API ที่ต้องใช้ apikey เป็นส่วนหนึ่งของคำขอคุณจะป้องกันไม่ให้บุคคลอื่นที่ไม่ใช่เจ้าของ apikey สามารถมองเห็น apikey (ตั้งแต่ส่งชัดเจน) และทำการร้องขอมากเกินไปที่จะผลักดันพวกเขาเกินขีด จำกัด การใช้งาน? บางทีฉันแค่คิดเรื่องนี้ แต่ไม่ควรมีสิ่งที่จะพิสูจน์ว่าคำขอได้รับการตรวจสอบกับเจ้าของ apikey หรือไม่? ในกรณีของฉันนั่นคือจุดประสงค์ของ apisecret มันไม่เคยแสดง / ส่งโดยไม่ถูกแฮช
พูดถึง hashes แล้ว md5 กับ hmac-sha1 ล่ะ? มันมีความสำคัญจริง ๆ หรือไม่เมื่อค่าทั้งหมดถูกแฮชด้วยข้อมูลที่มีความยาวเพียงพอ (เช่น apisecret)
ก่อนหน้านี้ฉันได้พิจารณาเพิ่มเกลือต่อผู้ใช้ / แถวในแฮชรหัสผ่านผู้ใช้ของฉัน หากฉันต้องทำเช่นนั้นแอปพลิเคชันจะสามารถสร้างแฮชที่ตรงกันโดยไม่ทราบว่าใช้เกลือได้อย่างไร