OAuth 2 ป้องกันสิ่งต่าง ๆ เช่นการโจมตีเล่นซ้ำโดยใช้โทเค็นความปลอดภัยได้อย่างไร


564

ตามที่ผมเข้าใจมันห่วงโซ่ต่อไปของเหตุการณ์ที่เกิดขึ้นใน OAuth 2 เพื่อให้Site-Aเข้าถึงผู้ใช้Site-Bข้อมูลจาก

  1. Site-AลงทะเบียนSite-Bและรับ Secret และ ID
  2. เมื่อผู้ใช้บอกSite-Aต่อการเข้าถึงSite-B, ผู้ใช้จะถูกส่งไปSite-Bที่พวกเขาบอกSite-Bว่าพวกเขาจะแน่นอนชอบที่จะให้Site-Aสิทธิ์กับข้อมูลที่เฉพาะเจาะจง
  3. Site-Bเปลี่ยนเส้นทางผู้ใช้กลับไปที่Site-Aพร้อมกับรหัสการอนุญาต
  4. Site-Aจากนั้นส่งรหัสการอนุญาตพร้อมกับความลับของมันกลับไปเพื่อSite-Bตอบแทนโทเค็นความปลอดภัย
  5. Site-Aจากนั้นทำการร้องขอSite-Bในนามของผู้ใช้โดยการรวมโทเค็นความปลอดภัยพร้อมกับคำขอ

ทั้งหมดนี้ทำงานอย่างไรในแง่ของความปลอดภัยและการเข้ารหัสในระดับสูง? OAuth 2 ป้องกันสิ่งต่าง ๆ เช่นการโจมตีเล่นซ้ำโดยใช้โทเค็นความปลอดภัยได้อย่างไร


49
oauth2 อธิบายง่ายๆที่นี่: gist.github.com/mziwisky/10079157
เปาโล

4
อ่านข้อมูลจำเพาะ: tools.ietf.org/html/rfc6749คุณอาจประหลาดใจที่เข้าใจได้ นอกจากนี้ยังถูกต้องซึ่งอาจไม่เลวร้ายเกินไป
Kris Vandermotten

1
คำถามนี้และคำตอบ (ปัจจุบัน) ตอบทั้งหมดมุ่งเน้นไปที่หนึ่ง "ประเภทการให้" ใน OAuth 2.0 (เช่นcode) แต่มีประเภทการให้สิทธิ์อื่น ๆ ที่กำหนดไว้ใน OAuth 2.0 ที่เกี่ยวข้องกับกรณีการใช้งานที่แตกต่างกัน
Hans Z.

4
โอ้ทำไมไม่แทนที่ "ไซต์ B" ด้วยสิ่งที่อ่านง่ายกว่าเช่น "IdProvider Site"
Yurii

คำตอบ:


1378

OAuth 2.0 ทำงานอย่างไรในชีวิตจริง:

ฉันกำลังขับรถโดยร้านเบเกอรี่ของ Olaf ระหว่างเดินทางไปทำงานเมื่อฉันเห็นโดนัทที่อร่อยที่สุดในหน้าต่าง - ฉันหมายถึงสิ่งนั้นหยดความดีของช็อคโกแลต ดังนั้นฉันจึงเข้าไปข้างในและเรียกร้องให้ "ฉันต้องมีโดนัทนั้น" เขากล่าวว่า "แน่นอนว่าจะได้ $ 30"

ใช่ฉันรู้ว่า $ 30 สำหรับหนึ่งโดนัท! มันจะต้องอร่อย! ฉันไปถึงกระเป๋าเงินเมื่อจู่ๆฉันก็ได้ยินเสียงพ่อครัวร้องว่า "ไม่! ไม่มีโดนัทสำหรับคุณ" ฉันถามว่า: ทำไม เขาบอกว่าเขายอมรับการโอนเงินทางธนาคารเท่านั้น

อย่างจริงจัง? ใช่เขาจริงจัง ฉันเกือบจะเดินไปที่นั่น แต่โดนัทเรียกฉันออกมา: "กินฉันฉันอร่อย ... " ฉันจะไม่เชื่อฟังคำสั่งซื้อจากโดนัทได้อย่างไร ฉันว่าโอเค

เขาส่งโน้ตพร้อมชื่อของเขาให้ฉัน (พ่อครัวไม่ใช่โดนัท): "บอกพวกเขาว่า Olaf ส่งคุณ" ชื่อของเขาเป็นที่ทราบอยู่แล้วดังนั้นฉันไม่รู้ว่าจุดที่พูดนั้นเป็นอะไร แต่ก็โอเค

ฉันขับรถไปธนาคารหนึ่งชั่วโมงครึ่ง ฉันส่งบันทึกไปยังพนักงาน ฉันบอกเธอว่า Olaf ส่งฉันมา เธอทำให้ฉันดูอย่างใดอย่างหนึ่งแบบที่บอกว่า "ฉันอ่านได้"

เธอจดบันทึกของฉันถามรหัสของฉันถามฉันว่าเงินเท่าไรที่จะให้เขา ฉันบอกเธอ $ 30 เหรียญ เธอเขียนหวัดแล้วส่งโน้ตอีกอันให้ฉัน อันนี้มีตัวเลขอยู่จำนวนหนึ่งฉันเดาว่านั่นเป็นวิธีที่พวกเขาติดตามบันทึก

ณ จุดนี้ฉันหิวโหย ฉันรีบออกไปจากที่นั่นหนึ่งชั่วโมงครึ่งต่อมาฉันกลับมายืนอยู่หน้าโอลาฟพร้อมกับจดบันทึก เขาหยิบมันดูมันแล้วพูดว่า "ฉันจะกลับมา"

ฉันคิดว่าเขาได้รับโดนัทของฉัน แต่หลังจาก 30 นาทีฉันก็เริ่มสงสัย ดังนั้นฉันจึงถามคนที่อยู่หลังเคาน์เตอร์ "Where's Olaf?" เขาพูดว่า "เขาไปรับเงิน" "คุณหมายถึงอะไร" "เขารับทราบถึงธนาคาร"

หือ ... ดังนั้นโอลาฟจึงรับทราบว่าธนาคารให้ฉันและกลับไปที่ธนาคารเพื่อรับเงินออกจากบัญชีของฉัน เนื่องจากเขาได้ทราบว่าธนาคารให้ฉันธนาคารรู้ว่าเขาเป็นคนที่ฉันพูดถึงและเพราะฉันพูดกับธนาคารที่พวกเขารู้ว่าจะให้เขาเพียง $ 30

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

ฮะ. ขณะที่ฉันกำลังเดินกลับไปที่รถของฉันโทรศัพท์ของฉันดังขึ้น ฉันไม่ตื๊อตอบมันอาจเป็นงานของฉันที่จะโทรหาฉันเจ้านายของฉันช่างเป็นแบบนี้ นอกจากนี้ฉันยังไม่ทันได้นึกถึงกระบวนการที่เพิ่งทำไป

ฉันหมายถึงคิดว่า: ฉันสามารถให้ Olaf นำเงิน 30 เหรียญออกจากบัญชีธนาคารของฉันโดยไม่ต้องให้ข้อมูลบัญชีของเขากับเขา และฉันไม่ต้องกังวลว่าเขาจะเอาเงินมากเกินไปเพราะฉันบอกธนาคารว่าเขาได้รับอนุญาตให้ใช้เงินเพียง $ 30 และธนาคารรู้ว่าเขาเป็นคนที่ใช่เพราะเขามีข้อความที่ให้ฉันมอบให้กับโอลาฟ

ตกลงแน่ใจว่าฉันอยากจะส่งเขา $ 30 จากกระเป๋าของฉัน แต่ตอนนี้เขามีโน้ตนั้นฉันสามารถบอกให้ธนาคารรับเงินได้ 30 ดอลลาร์ทุกสัปดาห์จากนั้นฉันจะแสดงที่ร้านเบเกอรี่และฉันไม่ต้องไปที่ธนาคารอีกต่อไป ฉันยังสามารถสั่งโดนัททางโทรศัพท์ได้ด้วยถ้าฉันต้องการ

แน่นอนฉันไม่เคยทำอย่างนั้น - โดนัทนั่นน่ารังเกียจ

ฉันสงสัยว่าวิธีการนี้มีแอปพลิเคชันที่กว้างขึ้นหรือไม่ เขาบอกว่านี่เป็นวิธีที่สองของเขาฉันเรียกได้ว่า Olaf 2.0 ต่อไปฉันจะกลับบ้านดีกว่าฉันต้องเริ่มหางานใหม่ แต่ไม่ก่อนที่ฉันจะได้สตรอเบอรี่หนึ่งในนั้นจากที่ใหม่ทั่วเมืองฉันต้องการบางสิ่งบางอย่างเพื่อล้างรสชาติของโดนัทนั้น


41
ในทางปฏิบัติ Olaf น่าจะสามารถรับเงิน 30 ดอลลาร์จากบัญชีของคุณได้ทุกเมื่อที่เขาต้องการแม้ว่าคุณจะไม่สั่งโดนัทก็ตาม ที่น่าสนใจนั่นคือเป้าหมายหลักในสถานการณ์จริง oauth2.0 :) นี่เป็นคำตอบที่ดีมาก แต่ใครก็ตามที่กำลังอ่านข้อความนี้โปรดไปที่หัวข้อสำคัญ ๆ ที่ Paolo พูดถึงในการแสดงความคิดเห็นของคำถาม ( gist.github.com/mziwisky/ 10079157 ) อ่านเพิ่มเติมที่ดีเพื่อให้แนวคิดที่ชัดเจน
Samiron

4
คำตอบที่ดี แต่ยก 2 คะแนน: 1. ตามที่ @Samiron ชี้ให้เห็น Olaf จะสามารถรับ 30 $ เมื่อใดก็ได้ที่เขาต้องการ 2. ในสถานการณ์จริง OAuth2.0 โอลาฟจะไม่สามารถให้บริการโดนัทก่อนนำเงินออกจากธนาคาร ในตัวอย่างนี้เขาสามารถเก็บเช็คและส่งหลุยส์ของเขาที่ได้รับมาอย่างดี ดังนั้นถ้าเราปรับเปลี่ยนตัวอย่างเพื่อให้ฉันอนุญาตให้ Olaf รับแป้งจากบุคคลที่สามที่ฉันรู้แล้วมันจะสมเหตุสมผลมากกว่าที่ Olaf จะต้องได้รับแป้งก่อนที่เขาจะเริ่มอบโดนัท (สมมติว่าโดนัทโดดเดี่ยว Olaf มีไว้เพื่อการแสดงผลเท่านั้น!)
Ticker23

4
ticker23 เรื่องราวโดนัทน่าเสียดายที่การแก้ไขทางเทคนิคของคุณ - ฉันถูกขายในเรื่องเมื่อฉันอ่านมัน มันถูกเขียนโดย Homer Simpson
shevy

4
@Prageeth Olaf มักจะนำธนบัตรไปและกลับจากธนาคารในกล่องนิรภัยที่รั่วออกมาหากถูกดัดแปลงมันจะใช้เวลานานมากในการกู้คืนบันทึก ธนาคารใช้ลายนิ้วมือของลูกค้าในการเยี่ยมชมครั้งแรกของพวกเขาหากโอลาฟสูญเสียนิ้วมือของเขาจากอุบัติเหตุในการทำอาหารเขาจะต้องขอให้หลุยส์ติดตั้งการโอนเงินผ่านธนาคารอีกครั้งและธนาคารจะต้องระบุ Olaf ด้วยรอยสักขนมปัง .
Chris

11
ฉันรักคำตอบที่น่ารักมากพอ ๆ กับคนต่อไปและเมื่อความน่ารักของพวกเขาช่วยให้สามารถเข้าถึงคำตอบได้มากขึ้นนั่นก็ยอดเยี่ยม ... แต่ในตอนท้ายของวัน Stack Overflow เป็นเรื่องของการให้ความรู้กับผู้คน เพื่อให้เข้าใจถึงการเปรียบเทียบโดนัทคุณต้องเข้าใจแล้วว่า OAuth2 ทำงานอย่างไร แต่ประเด็นทั้งหมดของคำตอบควรจะอธิบายได้อย่างแม่นยำ โปรดพิจารณาการแก้ไขคำตอบ (บนสุด) นี้เพื่ออธิบายแนวคิดจริง ๆ ไม่ใช่แค่อ้างอิงตอนท้าย ๆ เท่านั้นแม้ว่าจะเป็นเรื่องตลกหรือสองเรื่องก็ตาม
machineghost

133

จากสิ่งที่ฉันได้อ่านนี่คือการทำงานทั้งหมด:

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

โดยรวมแล้ว OAuth 2 จริง ๆ แล้วเป็นรูปแบบการรักษาความปลอดภัยที่ง่ายมากและการเข้ารหัสไม่เคยเข้ามามีบทบาทโดยตรง ทั้งลับและโทเค็นความปลอดภัยเป็นรหัสผ่านเป็นหลักและสิ่งทั้งหมดนั้นปลอดภัยโดยการรักษาความปลอดภัยของการเชื่อมต่อ https

OAuth 2 ไม่มีการป้องกันการโจมตีเล่นซ้ำของ Security Token หรือ Secret แต่จะอาศัยเว็บไซต์ B ทั้งหมดที่รับผิดชอบรายการเหล่านี้และไม่ให้พวกเขาออกไปและพวกเขาจะถูกส่งผ่าน https ขณะอยู่ระหว่างการขนส่ง (https จะปกป้องพารามิเตอร์ URL)

จุดประสงค์ของขั้นตอนรหัสการอนุญาตคือความสะดวกสบายและรหัสการอนุญาตไม่ได้มีความละเอียดอ่อนโดยเฉพาะอย่างยิ่งในตัวเอง มันมีตัวระบุทั่วไปสำหรับโทเค็นการเข้าถึงของผู้ใช้ X สำหรับไซต์ A เมื่อถามไซต์โทเค็นการเข้าถึงของโทเค็น X เพียงแค่รหัสผู้ใช้ X ของผู้ใช้บนไซต์ B จะไม่ทำงานเนื่องจากอาจมีโทเค็นการเข้าถึงที่ยอดเยี่ยมมากมายที่รอส่งมอบให้กับไซต์ต่างๆในเวลาเดียวกัน


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

3
ตกลง @auricen ที่เหมาะสม ... แต่การโจมตีรีเพลย์ไม่สามารถเกิดขึ้นได้ด้วยโทเค็นการรีเฟรชเพราะนั่นคือสิ่งที่จบลงด้วยการส่งคำขอแต่ละครั้ง?
นายมิคเคล

15
รหัสการให้สิทธิ์จะถูกส่งผ่านผู้ใช้ดังนั้น (ตัวอย่างเช่น) สามารถเก็บไว้เป็นคุกกี้ได้ (ดูstackoverflow.com/questions/4065657/… ) โทเค็นการรีเฟรชจะส่งผ่านโดยตรงระหว่างสองไซต์ดังนั้นจึงมีความเสี่ยงน้อยกว่ามาก
Maurice Naftalin

OAuth ส่งคืนตัวบ่งชี้เฉพาะสำหรับโปรแกรมที่จะใช้หรือไม่ ตัวอย่างเช่นขณะนี้ฉันกำลังใช้ที่อยู่ MAC เพื่อระบุตัวตนของผู้ใช้ แต่จากที่กล่าวมา MACs นั้นไม่น่าเชื่อถือ / easySpoofed / etc ฉันเพิ่งจะทิ้งกลไกการระบุที่อยู่ MAC และไปที่ OAuth หากอนุญาตให้ฉันระบุผู้ใช้โดยไม่ซ้ำได้
theGreenCabbage

1
โปรดสังเกตในแผนภาพนี้: tools.ietf.org/html/rfc6749#section-4.1ที่ไม่แสดง "ความลับ" เฉพาะรหัสประจำตัวลูกค้า (ID ในคำถาม) เหตุใดความลับจึงมีความสำคัญและเหตุใดจึงไม่รวมอยู่ใน RFC นอกจากนี้ในคำถามยังมีสถานะท้องถิ่นซึ่งแนะนำให้ส่งผ่านในการส่งครั้งแรกของรหัสลูกค้า (A) และการเปลี่ยนเส้นทางกลับไปยังไคลเอนต์พร้อมกับรหัสการอนุญาตเพื่อป้องกัน XSSF
David Williams

104

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

นี่คือตัวอย่างกรณีการใช้งาน:

  1. ฉันเข้าสู่ระบบ LinkedIn และต้องการเชื่อมต่อเพื่อนบางคนที่อยู่ในสมุดติดต่อ Gmail ของฉัน LinkedIn สนับสนุนสิ่งนี้ มันจะขอทรัพยากรที่ปลอดภัย (รายชื่อผู้ติดต่อ gmail ของฉัน) จาก gmail ดังนั้นฉันคลิกปุ่มนี้:
    เพิ่มการเชื่อมต่อ

  2. หน้าเว็บปรากฏขึ้นและจะแสดงหน้าเข้าสู่ระบบ Gmail เมื่อฉันป้อนบัญชีและรหัสผ่าน:
    เพิ่มการเชื่อมต่อ

  3. จากนั้น Gmail จะแสดงหน้าความยินยอมซึ่งฉันคลิก "ยอมรับ": เพิ่มการเชื่อมต่อ

  4. ตอนนี้ LinkedIn สามารถเข้าถึงผู้ติดต่อของฉันใน Gmail: เพิ่มการเชื่อมต่อ

ด้านล่างเป็นแผนผังลำดับงานของตัวอย่างด้านบน:

เพิ่มการเชื่อมต่อ

ขั้นตอนที่ 1: LinkedIn ขอโทเค็นจากเซิร์ฟเวอร์การอนุญาตของ Gmail

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

ขั้นตอนที่ 3: ผู้ใช้ให้การอนุญาตแก่ LinkedIn เพื่อเข้าถึงข้อมูล Gmail

ขั้นตอนที่ 4: เซิร์ฟเวอร์การอนุญาต Gmail ตอบกลับด้วยโทเค็นการเข้าถึง

ขั้นตอนที่ 5: LinkedIn เรียก Gmail API ด้วยโทเค็นการเข้าถึงนี้

ขั้นตอนที่ 6: เซิร์ฟเวอร์ทรัพยากร Gmail ส่งคืนผู้ติดต่อของคุณหากโทเค็นการเข้าถึงนั้นถูกต้อง (โทเค็นจะได้รับการยืนยันโดยเซิร์ฟเวอร์ทรัพยากร Gmail)

คุณจะได้รับเพิ่มเติมจากรายละเอียดเกี่ยวกับ OAuth ที่นี่


ภาพทั้งหมดของคุณหายไป มีโอกาสใดที่คุณสามารถโหลดมันลงไปในกองซ้อนได้ไหม?
ChrisF

1
สิ่งนี้จะถูกต้องได้อย่างไร กระบวนการนี้ไม่ได้เกิดจากการที่ผู้ใช้นั่งอยู่หน้าเบราว์เซอร์ไม่ใช่ LinkedIn แต่คุณมีขั้นตอนที่ 3 นี่คือสิ่งที่ฉันไม่ได้รับ
Matt

17
คำอธิบายที่ง่ายที่สุด ขอบคุณฉันจะไม่ซื้อโดนัทอีกเลย
OverCoder

ขั้นตอนที่ 4 ถูกเชื่อมโยงกลับมาพร้อมกับโทเค็นการอนุญาต สิ่งนี้จะต้องมีการจัดหาในขั้นตอนที่ 5 ซึ่งเราจะได้รับโทเค็นการเข้าถึงและโทเค็นการรีเฟรชซึ่งสามารถใช้เพิ่มเติมสำหรับทรัพยากรที่ได้รับการป้องกัน
amesh

@amesh ขอบคุณคุณพูดถูกนั่นเป็นรหัสการอนุญาตที่นี่ฉันเพิ่งพูดแบบง่าย ๆ เพื่อแสดงแนวคิดพื้นฐานของ OAuth 2
Owen Cao

24

รูปที่ 1 ยกจากRFC6750 :

     +--------+                               +---------------+
     |        |--(A)- Authorization Request ->|   Resource    |
     |        |                               |     Owner     |
     |        |<-(B)-- Authorization Grant ---|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(C)-- Authorization Grant -->| Authorization |
     | Client |                               |     Server    |
     |        |<-(D)----- Access Token -------|               |
     |        |                               +---------------+
     |        |
     |        |                               +---------------+
     |        |--(E)----- Access Token ------>|    Resource   |
     |        |                               |     Server    |
     |        |<-(F)--- Protected Resource ---|               |
     +--------+                               +---------------+

13

นี่คือวิธีการทำงานของ Oauth 2.0 อธิบายได้ดีในบทความนี้

ป้อนคำอธิบายรูปภาพที่นี่


คุณสามารถอธิบาย OAUTH2 ในแง่ของการไม่ใช้ Facebook หรือบุคคลที่สามอื่น ๆ แต่ถ้าคุณใช้รหัสลับและโทเค็น TOTP ด้วยแอพโทรศัพท์เพื่อรักษาความปลอดภัยของเว็บแอป
อัลแกรนท์

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

ฉันกำลังมองหาการตั้งค่าความปลอดภัยสปริงบูท ความลับของลูกค้า (โทรศัพท์) และการแลกเปลี่ยนทางเว็บแอพพลิเคชั่นเมื่อลงทะเบียน - จากนั้นใช้ google authenticator เพื่อสร้างรหัสตามเวลา / ความลับเพื่อเข้าสู่ระหว่างการเข้าสู่ระบบนอกเหนือจากรหัสผ่าน
Al Grant

ความคิดเห็นสุดท้ายของฉันไม่ทำให้คุณเข้าใจอีกต่อไป? ดูโปรไฟล์ของฉันสำหรับข้อมูล twitter
Al Grant

คุณสามารถรับรหัสลูกค้าและความลับเมื่อลงทะเบียน จากนั้นโทรศัพท์ทำการร้องขอเข้าสู่ระบบด้วยรหัสลูกค้าไปยัง webapp ของคุณ (เซิร์ฟเวอร์การอนุญาต) เว็บแอปตรวจสอบรหัสลูกค้าและส่ง OTP ไปยังโทรศัพท์ โทรศัพท์ขออีกความลับของลูกค้าเป็น webapp เพื่อแลกเปลี่ยน OTP ด้วยโทเค็นการเข้าถึง โทรศัพท์ใช้โทเค็น accss นี้เพื่อเข้าถึงทรัพยากรที่มีการป้องกันบน webapp ฉันคิดว่านี่จะเป็นการไหลของ Oauth2 สำหรับสถานการณ์ที่กำหนด แจ้งให้เราทราบหากช่วยคุณได้
Suraj

10

นี่คืออัญมณี:

https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2

สรุปสั้น ๆ มาก:

OAuth กำหนดสี่บทบาท:

  1. เจ้าของทรัพยากร
  2. ไคลเอนต์
  3. เซิร์ฟเวอร์ทรัพยากร
  4. เซิร์ฟเวอร์การอนุญาต

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

เหตุผลที่มี OAuth อยู่เนื่องจากไม่ปลอดภัยสำหรับ GMail ในการจัดเก็บชื่อผู้ใช้และรหัสผ่าน Yahoo ของคุณ

ป้อนคำอธิบายรูปภาพที่นี่


8

คำตอบอื่น ๆ นั้นมีรายละเอียดมากและตอบคำถามจำนวนมากที่กล่าวถึงโดย OP

ในการอธิบายอย่างละเอียดและโดยเฉพาะเพื่อตอบคำถามของ OP "วิธี OAuth 2 ป้องกันสิ่งต่าง ๆ เช่นการโจมตีซ้ำโดยใช้ Security Token ได้อย่างไร" มีการป้องกันเพิ่มเติมสองประการในคำแนะนำอย่างเป็นทางการสำหรับการใช้ OAuth 2:

1) โทเค็นมักจะมีระยะเวลาหมดอายุสั้น ๆ ( http://tools.ietf.org/html/rfc6819#section-5.1.5.3 ):

เวลาหมดอายุสั้น ๆ สำหรับโทเค็นเป็นวิธีการป้องกันภัยคุกคามต่อไปนี้:

  • เล่นใหม่ ...

2) เมื่อไซต์โทเค็นถูกใช้งานข้อเสนอแนะคือจะไม่แสดงเป็นพารามิเตอร์ URL แต่ในฟิลด์ส่วนหัวคำขอการให้สิทธิ์ ( http://tools.ietf.org/html/rfc6750 ):

ลูกค้าควรทำการร้องขอที่ได้รับการรับรองความถูกต้องด้วยโทเค็นผู้ถือโดยใช้ฟิลด์หัวข้อการร้องขอ "การอนุญาต" ที่มีรูปแบบการให้สิทธิ์ HTTP "ผู้ถือ" ...

ไม่ควรใช้วิธี "application / x-www-form-urlencoded" ยกเว้นในบริบทของแอปพลิเคชันที่เบราว์เซอร์ที่เข้าร่วมไม่สามารถเข้าถึงฟิลด์ "หัวข้อการขออนุมัติ" ...

URI Query Parameter ... รวมอยู่ในเอกสารการใช้งานในปัจจุบัน ไม่แนะนำให้ใช้งานเนื่องจากข้อบกพร่องด้านความปลอดภัย


3

นี่อาจเป็นคำอธิบายที่ง่ายที่สุดเกี่ยวกับวิธีการทำงานของ OAuth2 สำหรับประเภทการให้สิทธิ์ทั้ง 4 ประเภทนั่นคือการไหล 4 แบบที่แอพสามารถรับโทเค็นการเข้าถึง

ความคล้ายคลึงกัน

โฟลว์ประเภท Grant ทั้งหมดมี 2 ส่วน:

  • รับโทเค็นการเข้าถึง
  • ใช้โทเค็นการเข้าถึง

ส่วนที่ 2 'การใช้โทเค็นการเข้าถึง'จะเหมือนกันสำหรับโฟลว์ทั้งหมด

ข้อแตกต่าง

ส่วนที่ 1 ของโฟลว์'รับโทเค็นการเข้าถึง'สำหรับแต่ละประเภททุนจะแตกต่างกันไป

อย่างไรก็ตามโดยทั่วไปสามารถสรุปส่วนได้รับ 'โทเค็นการเข้าถึง'ประกอบด้วย 5 ขั้นตอน:

  1. ลงทะเบียนแอปของคุณ (ลูกค้า) ล่วงหน้ากับผู้ให้บริการ OAuth เช่น Twitter และอื่น ๆ เพื่อรับรหัสประจำตัว / ความลับของลูกค้า
  2. สร้างปุ่มเข้าสู่ระบบสังคมด้วยรหัสลูกค้า & ขอบเขต / สิทธิ์ที่จำเป็นในหน้าของคุณดังนั้นเมื่อผู้ใช้ที่ถูกคลิกถูกเปลี่ยนเส้นทางไปยังผู้ให้บริการ OAuth เพื่อทำการตรวจสอบสิทธิ์
  3. ผู้ให้บริการ OAuth ขอให้ผู้ใช้อนุญาตให้แอปของคุณ (ลูกค้า)
  4. รหัสผู้ให้บริการ OAuth
  5. แอพ (ไคลเอ็นต์) รับโทเค็นการเข้าถึง

นี่คือไดอะแกรมแบบเคียงข้างกันเปรียบเทียบการไหลของการให้สิทธิ์แต่ละประเภทแตกต่างกันตาม 5 ขั้นตอน

แผนภาพนี้มาจากhttps://blog.oauth.io/introduction-oauth2-flow-diagrams/

ป้อนคำอธิบายรูปภาพที่นี่

แต่ละคนมีระดับความยากในการใช้งานที่แตกต่างกันความปลอดภัยและการใช้เคส คุณจะต้องใช้หนึ่งในนั้นขึ้นอยู่กับความต้องการและสถานการณ์ของคุณ ต้องใช้อะไร

ข้อมูลรับรองลูกค้า : หากแอปของคุณให้บริการผู้ใช้คนเดียว

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

รหัสการอนุญาต : วิธีที่ดีที่สุดในการขออนุมัติผู้ใช้

โดยนัย : หากคุณเป็นแอพมือถือหรือแอปหน้าเดียว

มีคำอธิบายเพิ่มเติมของตัวเลือกที่นี่: https://blog.oauth.io/choose-oauth2-flow-grant-types-for-app/

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