การรับรองความถูกต้อง REST API


181

ฉันกำลังสร้างแอปพลิเคชันซึ่งจะโฮสต์บนเซิร์ฟเวอร์ ฉันต้องการสร้าง API สำหรับแอปพลิเคชันเพื่อให้การโต้ตอบกับแพลตฟอร์มใด ๆ (Web App, Mobile App) สิ่งที่ฉันไม่เข้าใจคือเมื่อใช้ REST API เราจะรับรองความถูกต้องของผู้ใช้อย่างไร

ตัวอย่างเช่นเมื่อผู้ใช้ล็อกอินแล้วต้องการสร้างหัวข้อฟอรัม ฉันจะรู้ได้อย่างไรว่าผู้ใช้ลงชื่อเข้าใช้แล้ว


4
คุณควรค้นหา "การรับรองความถูกต้อง REST" ที่นี่ มันได้รับการกล่าวถึงในคำถามอื่น ๆ อีกมากมาย
Brian Kelly

10
สรุปให้ลูกค้าส่งชื่อผู้ใช้และรหัสผ่านทุกคำขอโดยใช้ HTTP Basic Auth (ผ่าน SSL!) หรือรับรองความถูกต้องหนึ่งครั้งเพื่อให้ลูกค้าได้รับการรับรองความถูกต้องซึ่งจะหมดอายุหลังจากไม่มีการใช้งานในช่วงระยะเวลาหนึ่ง การจัดการเซสชันของเฟรมเวิร์กของคุณ) เซสชั่นที่กล่าวมานั้นสามารถเก็บไว้ในคุกกี้หรือเป็นพารามิเตอร์ที่ผ่านการร้องขอทุกครั้ง (เช่น JSESSIONID ใน Java land)
opyate

ดูเพิ่มเติมวิธีการควบคุมที่ใช้เครื่องมือเว็บของฉัน
Arjan

@ คัดแยกจากมุมมองความปลอดภัยไม่ใช่ความคิดที่ดีที่จะจัดการเซสชันโดยใช้คุกกี้ในกรณี REST API เนื่องจากผู้โจมตีสามารถส่งคำขอโดยไม่ได้รับความยินยอมจากผู้ใช้ เป็นการดีกว่าที่จะรวมเซสชันแฮชหรือโทเค็นไว้ในส่วนหัว HTTP (เช่นการอนุญาต)
s3v3n

1
@ s3v3n แก้ไขให้ฉันถ้าฉันผิด แต่ทั้งคุณและคำแนะนำของฉันเป็นเพียงวิธีที่แตกต่างกันในการใช้ส่วนหัว + คำสั่งผสมที่จัดเก็บในตัวเครื่องเพื่อให้มีผลเหมือนกัน มันเป็นAuthorizationส่วนหัว + เช่นเบราว์เซอร์ localStorage VS Cookieส่วนหัว + ที่เก็บคุกกี้เบราว์เซอร์มาตรฐาน
opyate

คำตอบ:


72

คุณสามารถใช้ HTTP Basic หรือ Digest Authentication คุณสามารถรับรองความถูกต้องของผู้ใช้อย่างปลอดภัยโดยใช้ SSL ที่อยู่ด้านบนอย่างไรก็ตามจะทำให้ API ช้าลงเล็กน้อย

  • การพิสูจน์ตัวตนพื้นฐาน - ใช้การเข้ารหัส Base64 กับชื่อผู้ใช้และรหัสผ่าน
  • การตรวจสอบสิทธิ์ย่อย - แฮชชื่อผู้ใช้และรหัสผ่านก่อนส่งผ่านเครือข่าย

OAuthดีที่สุดที่จะได้รับ ข้อได้เปรียบที่ oAuth มอบให้คือโทเค็นที่เพิกถอนหรือมีค่าได้ อ้างอิงวิธีการใช้งานต่อไปนี้: Working Link จากความคิดเห็น: https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf


4
โปรดอ่านคำถามนี้และคำตอบที่ได้รับจาก Les Hazelwood (ผู้เขียน Apache Shiro)
justin.hughey

1
ลิงค์ที่มีประโยชน์ว่า Twitter ปกป้อง REST API อย่างไร: Twitter REST API ความปลอดภัย
WildDev

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

116

ตัวอย่างเช่นเมื่อผู้ใช้มีล็อกอินตอนนี้ให้ผู้ใช้ต้องการสร้างหัวข้อฟอรั่มฉันจะรู้ได้อย่างไรว่าผู้ใช้เข้าสู่ระบบแล้ว?

คิดเกี่ยวกับมัน - จะต้องมีการจับมือกันที่บอก "สร้างเวที" ของคุณ API ว่าคำขอปัจจุบันนี้มาจากผู้ใช้ที่ได้รับการรับรองความถูกต้อง ตั้งแต่ APIs REST มักจะไร้สัญชาติรัฐต้องหายที่ไหนสักแห่ง ลูกค้าของคุณใช้ REST APIs รับผิดชอบในการรักษาสถานะนั้น โดยปกติแล้วมันจะอยู่ในรูปแบบของโทเค็นบางตัวที่ถูกส่งผ่านมาตั้งแต่เวลาที่ผู้ใช้ล็อกอินถ้าโทเค็นดีคำขอของคุณดี

ตรวจสอบว่า Amazon AWS ทำการรับรองความถูกต้องอย่างไร นั่นเป็นตัวอย่างที่สมบูรณ์แบบของ "การผ่านเจ้าชู้" รอบ ๆ จาก API หนึ่งไปยังอีก

* ฉันคิดว่าจะเพิ่มการตอบสนองเชิงปฏิบัติบางอย่างให้กับคำตอบก่อนหน้าของฉัน ลอง Apache Shiro (หรือไลบรารีการพิสูจน์ตัวตน / การอนุญาตใด ๆ ) บรรทัดล่างลองและหลีกเลี่ยงการเข้ารหัสที่กำหนดเอง เมื่อคุณรวมไลบรารีที่คุณชื่นชอบ (ฉันใช้ Apache Shiro, btw) แล้วคุณสามารถทำสิ่งต่อไปนี้:

  1. สร้าง API การเข้าสู่ระบบ / ออกจากระบบเช่น: /api/v1/loginและapi/v1/logout
  2. ใน API การเข้าสู่ระบบและออกจากระบบเหล่านี้ให้ทำการตรวจสอบกับร้านค้าผู้ใช้ของคุณ
  3. ผลที่ได้คือโทเค็น (ปกติJSESSIONID) ที่ถูกส่งกลับไปยังลูกค้า (เว็บมือถืออะไรก็ตาม)
  4. จากจุดนี้เป็นต้นไปการโทรที่ตามมาทั้งหมดที่ทำโดยลูกค้าของคุณจะรวมโทเค็นนี้
  5. สมมติว่าการโทรครั้งต่อไปของคุณถูกเรียกใช้กับ API /api/v1/findUser
  6. สิ่งแรกที่รหัส API นี้จะทำคือตรวจสอบโทเค็น ("ผู้ใช้นี้รับรองความถูกต้องหรือไม่")
  7. หากคำตอบกลับมาเป็น NO แสดงว่าคุณส่งสถานะ HTTP 401 กลับไปที่ไคลเอ็นต์ ปล่อยให้พวกเขาจัดการกับมัน
  8. หากคำตอบคือใช่แล้วดำเนินการส่งคืนผู้ใช้ที่ร้องขอ

นั่นคือทั้งหมดที่ หวังว่านี่จะช่วยได้


ดังนั้นสิ่งที่คุณกำลังอธิบายเป็นหลักคุกกี้เซสชั่นใช่มั้ย
LordOfThePigs

ใช่ แต่เซสชันนั้น "คงไว้" ที่ 2 แห่ง หนึ่งในเซิร์ฟเวอร์ API อีกหนึ่งในเบราว์เซอร์ การตอบสนองของ JSON (หรืออะไรก็ตาม) กลับไปที่การโพสต์ของเบราว์เซอร์ที่ประสบความสำเร็จควรสื่อสาร id ของเซสชันบนเซิร์ฟเวอร์ API กลับไปที่เบราว์เซอร์ เซสชั่นเหล่านี้ได้รับการจัดการอย่างอิสระโดยตัวแทนที่เกี่ยวข้อง
Kingz

11
ฉันเชื่อว่า Kingz กำลังพยายามถ่ายทอดความคิดที่ว่ากลไกในการรักษาเซสชั่นนั้นคลุมเครือโดยเจตนา คุกกี้เซสชั่นเป็นเพียงการนำไปใช้ของกลไกนั้น
justin.hughey

2
@Kingz เกี่ยวกับความปลอดภัยในโซลูชันนี้ตัวอย่างเช่นหากแฮ็กเกอร์คนใดคนหนึ่งดมกลิ่นลิงค์ที่มี session_id และเริ่มส่งคำขอซึ่งเนื้อหาที่ถูกต้อง session_id? เราสามารถแก้ไขได้โดยเพิ่ม ssl ไปยังการเชื่อมต่อเซิร์ฟเวอร์ แต่ลูกค้าล่ะ?
Ahmad Samilo

1
วิธีการป้องกันไม่ให้เซสชั่นการจี้ในกรณีที่คนในกลาง - attrack?
m0z4rt

38
  1. ใช้HTTP Basic Authเพื่อตรวจสอบสิทธิ์ลูกค้า แต่ให้ใช้ชื่อผู้ใช้ / รหัสผ่านเป็นโทเค็นเซสชันชั่วคราวเท่านั้น

    โทเค็นเซสชั่นเป็นเพียงส่วนหัวที่แนบมากับทุกคำขอ HTTP เช่น: Authorization: Basic Ym9ic2Vzc2lvbjE6czNjcmV0

    สตริง Ym9ic2Vzc2lvbjE6czNjcmV0 ด้านบนเป็นเพียงสตริง "bobsession1: s3cret" (ซึ่งเป็นชื่อผู้ใช้ / รหัสผ่าน) เข้ารหัสใน Base64

  2. ในการรับโทเค็นเซสชันชั่วคราวด้านบนให้จัดทำฟังก์ชัน API (เช่น:) http://mycompany.com/apiv1/loginซึ่งใช้ชื่อผู้ใช้หลักและรหัสผ่านหลักเป็นอินพุตสร้างชื่อผู้ใช้ / รหัสผ่าน HTTP Basic Auth ชั่วคราวทางฝั่งเซิร์ฟเวอร์และส่งคืนโทเค็น (เช่น: Ym9ic2Vzc2lvbjE6czNjcmV0) ชื่อผู้ใช้ / รหัสผ่านนี้ควรเป็นชั่วคราวมันควรจะหมดอายุหลังจาก 20 นาทีหรือมากกว่านั้น

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

หากคุณใช้ Java ห้องสมุด Spring Security ให้การสนับสนุนที่ดีในการใช้วิธีการด้านบน


1
ทำไมมันควรจะหมดอายุหลังจาก 20 นาที จะเกิดอะไรขึ้นถ้ามันเป็นเว็บไซต์อย่าง Facebook ที่การเข้าสู่ระบบนั้นจนกว่าผู้ใช้จะออกจากระบบ
Dejell

1
@dejel ฉันอยู่ภายใต้สมมติฐาน "เซสชั่น" เป็นชั่วคราวในธรรมชาติ เป็นเรื่องปกติที่จะหมดอายุหากผู้ใช้ไม่ทำงาน
gerrytan

Base64 มีไว้ทำอะไร? คุณสามารถส่งคืนรหัสผ่านชั่วคราวได้ ในทั้งสองกรณีสิ่งที่สำคัญคือรหัสผ่านชั่วคราวนี้แข็งแกร่ง ตรวจสอบsecurity.stackexchange.com/a/19686/72945
e18r

7

ฉันคิดว่าวิธีที่ดีที่สุดคือใช้ OAuth2 Google แล้วคุณจะพบโพสต์ที่มีประโยชน์มากมายเพื่อช่วยคุณตั้งค่า

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

หวังว่ามันจะช่วยคุณ


2
โปรดอ่านคำถามนี้และคำตอบโดย Les Hazelwood (ผู้เขียน Apache Shiro)
justin.hughey

0

ฉันใช้การตรวจสอบ JWT ทำงานได้ดีในใบสมัครของฉัน

มีวิธีการรับรองความถูกต้องที่จะต้องมีข้อมูลประจำตัวของผู้ใช้ วิธีการนี้จะตรวจสอบข้อมูลรับรองและส่งคืนโทเค็นการเข้าถึงในกรณีที่ประสบความสำเร็จ

โทเค็นนี้ต้องถูกส่งไปยังทุก ๆ เมธอดใน Web API ของฉันในส่วนหัวของคำขอ

มันง่ายที่จะติดตั้งและทดสอบได้ง่ายมาก

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