ฉันแน่ใจว่าคุณพอใจที่จะจัดการกับการเข้าสู่ระบบของผู้ใช้และการสื่อสารผ่าน SSL ดังนั้นฉันจะมุ่งเน้นไปที่สิ่งที่ฉันคิดว่ามันเป็นส่วนที่น่าสนใจมากขึ้นของคำถาม: วิธีการให้แน่ใจว่าการกระทำแบบอ่านอย่างเดียวของคุณ - ซึ่งไม่ต้องการให้ผู้ใช้รับรองความถูกต้อง - ได้รับการยอมรับจากแอปไคลเอ็นต์ของคุณเท่านั้น
ก่อนอื่นจะมีข้อเสียที่ fNek พูดถึงในคำตอบก่อนหน้านี้ - แอปไคลเอ็นต์ของคุณอยู่ในมือของผู้ใช้ที่อาจเป็นศัตรู พวกเขาสามารถตรวจสอบได้ตรวจสอบการสื่อสารของพวกเขาถอดรหัสของพวกเขา ไม่มีอะไรที่ฉันจะแนะนำจะช่วยให้คุณรับประกันได้ว่ามีใครบางคนไม่ทำวิศวกรรมย้อนกลับลูกค้าของคุณและละเมิด REST API ของคุณ แต่ควรวางสิ่งกีดขวางต่อหน้าความพยายามชั่วคราว
อย่างไรก็ตามวิธีการทั่วไปคือ:
- ลูกค้ามีความลับ
- เมื่อทำการร้องขอมันจะเชื่อมต่อพารามิเตอร์การร้องขอกับความลับและแฮชผลลัพธ์
- แฮชนี้จะถูกส่งไปพร้อมกับคำขอและตรวจสอบโดยเซิร์ฟเวอร์
เช่นจินตนาการGET
คำขอ/products/widgets
สมมติว่าความลับของลูกค้าคือ "OH_HAI_I_IZ_SECRET"
เชื่อมต่อกริยา HTTP และ URL และความลับเข้าด้วยกัน:
GET/products/widgetsOH_HAI_I_IZ_SECRET
และใช้แฮชSHA-1ของสิ่งนั้น:
4156023ce06aff06777bef3ecaf6d7fdb6ca4e02
จากนั้นส่งไปตามดังนั้นคำขอจะเป็น:
GET /products/widgets?hash=4156023ce06aff06777bef3ecaf6d7fdb6ca4e02
ในที่สุดเพื่อป้องกันไม่ให้ใครบางคนเล่นซ้ำการร้องขอแต่ละครั้งอย่างน้อยก็ให้ใช้การประทับเวลาด้วยและเพิ่มเข้าไปในพารามิเตอร์และแฮช เช่นตอนนี้ในเวลา Unix คือ 1384987891. เพิ่มเข้าไปใน concatenation:
GET/products/widgetsOH_HAI_I_IZ_SECRET1384987891
แฮช:
2774561d4e9eb37994d6d71e4f396b85af6cacd1
และส่ง:
GET /products/widgets?time=1384987891&hash=2774561d4e9eb37994d6d71e4f396b85af6cacd1
เซิร์ฟเวอร์จะตรวจสอบแฮชและตรวจสอบว่าการประทับเวลาเป็นปัจจุบัน (เช่นภายใน 5 นาทีเพื่ออนุญาตให้นาฬิกาไม่ซิงค์กันอย่างสมบูรณ์)
คำเตือน! เนื่องจากคุณกำลังพูดถึงแอพมือถือมีความเสี่ยงที่แน่นอนว่าโทรศัพท์ของใครบางคนจะมีนาฬิกาผิด หรือเขตเวลาผิด หรือบางสิ่งบางอย่าง. การเพิ่มเวลาลงในแฮชอาจทำให้ผู้ใช้ที่ชอบด้วยกฎหมายบางคนใช้ความคิดนั้นด้วยความระมัดระวัง