ขั้นตอน OAuth 2.0 ที่เหมาะสมสำหรับแอปบนอุปกรณ์เคลื่อนที่คืออะไร


89

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

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

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


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

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

1
คุณสามารถเพิ่มโทเค็นที่มีอายุการใช้งานไม่สิ้นสุดและยังเพิกถอนได้ และใช่ตรรกะของแอปควรตรวจจับได้ RFC 6750 กำหนดวิธีตรวจสอบว่าข้อผิดพลาดเกิดจากโทเค็นที่ถูกเพิกถอนหรือไม่
Pedro Felix

1
โปรดหลีกเลี่ยงการดูเว็บ (เว้นแต่คุณจะเป็นเจ้าของสแต็กเต็มรูปแบบและไม่ได้ใช้การเข้าสู่ระบบโซเชียล) ซึ่งเปิดโอกาสในการบุกรุกรหัสผ่าน เมื่อฉันถูกขอข้อมูลรับรองจากตัวแทนผู้ใช้ที่ฝังตัวบุคคลที่สามฉันจะถอนการติดตั้งแอป ขณะนี้ API บางตัวยังห้ามการผสานรวมเช่นนี้dev.fitbit.com/docs/oauth2ฉันได้ให้คำตอบอื่นเพื่อชี้แจงแนวคิดเหล่านี้เพิ่มเติม ( stackoverflow.com/a/38582630/752167 )
Matt C

คำตอบ:


91

ชี้แจง: Mobile App = Native App

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

แนวทางปฏิบัติที่ดีที่สุดสำหรับแอป OAuth2

ไม่ว่าคุณจะเลือกแนวทางใด (มีข้อยกเว้นบางประการที่ต้องพิจารณา) คุณควรใส่ใจกับแนวทางปฏิบัติที่ดีที่สุดตามที่อธิบายไว้ที่นี่สำหรับ Native Apps ที่ใช้ OAuth2: https://tools.ietf.org/html/rfc8252

พิจารณาตัวเลือกต่อไปนี้

โดยปริยาย

ฉันควรใช้นัยหรือไม่?

อ้างจากหัวข้อ 8.2 https://tools.ietf.org/html/rfc8252#section-8.2

ขั้นตอนการอนุญาตโดยปริยาย OAuth 2.0 (กำหนดไว้ในส่วน 4.2 ของ OAuth 2.0 [RFC6749]) โดยทั่วไปจะทำงานร่วมกับการปฏิบัติตามคำขอการอนุญาตในเบราว์เซอร์และรับการตอบสนองการอนุญาตผ่านการสื่อสารระหว่างแอปที่ใช้ URI
อย่างไรก็ตามเนื่องจาก PKCE [RFC7636] ไม่สามารถป้องกันโฟลว์โดยนัยได้ (ซึ่งจำเป็นในส่วน 8.1) จึงไม่แนะนำให้ใช้ Implicit Flow กับแอปเนทีฟมาพร้อมเครื่อง

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

รหัสการอนุญาต

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

ข้อความที่ตัดตอนมาด้านล่างจาก: https://dev.fitbit.com/docs/oauth2/

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

หมายเหตุ: อย่าใส่รหัสลับไคลเอ็นต์ของคุณในโค้ดแบบกระจายเช่นแอพที่ดาวน์โหลดผ่านแอพสโตร์หรือ JavaScript ฝั่งไคลเอ็นต์

แอปพลิเคชันที่ไม่มีบริการเว็บควรใช้ขั้นตอนการให้โดยนัย

สรุป

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

การอ่านที่ยอดเยี่ยมอยู่ที่นี่https://auth0.com/blog/oauth-2-best-practices-for-native-apps/

อีกอันหนึ่งคือhttps://www.oauth.com/oauth2-servers/oauth-native-apps/ซึ่งระบุว่า

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

การพิจารณา PKCE

คุณควรพิจารณา PKCE ซึ่งอธิบายไว้ที่นี่ https://www.oauth.com/oauth2-servers/pkce/

โดยเฉพาะอย่างยิ่งหากคุณกำลังติดตั้งเซิร์ฟเวอร์การอนุญาตด้วยเช่นกันhttps://www.oauth.com/oauth2-servers/oauth-native-apps/checklist-server-support-native-apps/ระบุว่าคุณควร

  • อนุญาตให้ไคลเอ็นต์ลงทะเบียนโครงร่าง URL ที่กำหนดเองสำหรับ URL เปลี่ยนเส้นทาง
  • สนับสนุน URL เปลี่ยนเส้นทาง IP แบบวนกลับพร้อมหมายเลขพอร์ตที่กำหนดเองเพื่อรองรับแอปเดสก์ท็อป
  • อย่าคิดว่าแอปที่มาพร้อมเครื่องสามารถเก็บเป็นความลับได้ กำหนดให้แอปทั้งหมดต้องประกาศว่าเป็นสาธารณะหรือเป็นความลับและแจ้งเฉพาะความลับของไคลเอ็นต์ให้กับแอปที่เป็นความลับ
  • สนับสนุนส่วนขยาย PKCE และกำหนดให้ลูกค้าสาธารณะใช้งานได้
  • พยายามตรวจสอบเมื่ออินเทอร์เฟซการให้สิทธิ์ฝังอยู่ในมุมมองเว็บของแอปในระบบแทนที่จะเปิดในเบราว์เซอร์ระบบและปฏิเสธคำขอเหล่านั้น

การพิจารณาการดูเว็บ

มีตัวอย่างมากมายในการใช้ Web Views เช่น User-agent แบบฝัง แต่ควรหลีกเลี่ยงวิธีนี้ (โดยเฉพาะเมื่อแอปไม่ใช่บุคคลที่หนึ่ง) และในบางกรณีอาจส่งผลให้คุณถูกห้ามไม่ให้ใช้ API เป็นข้อความที่ตัดตอนมา ด้านล่างจากที่นี่แสดงให้เห็น

ความพยายามใด ๆ ในการฝังหน้าการตรวจสอบสิทธิ์ OAuth 2.0 จะส่งผลให้แอปพลิเคชันของคุณถูกแบนจาก Fitbit API

เพื่อการพิจารณาด้านความปลอดภัยหน้าการให้สิทธิ์ OAuth 2.0 ต้องแสดงในมุมมองเบราว์เซอร์เฉพาะ ผู้ใช้ Fitbit สามารถยืนยันได้ก็ต่อเมื่อตรวจสอบสิทธิ์กับเว็บไซต์ Fitbit.com ของแท้หากพวกเขามีเครื่องมือที่เบราว์เซอร์จัดเตรียมไว้ให้เช่นแถบ URL และข้อมูลใบรับรอง Transport Layer Security (TLS)

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

แอปพลิเคชัน iOS อาจใช้คลาส SFSafariViewController แทนการเปลี่ยนแอปเป็น Safari ห้ามใช้คลาส WKWebView หรือ UIWebView

แอปพลิเคชัน Android อาจใช้ Chrome Custom Tabs แทนการเปลี่ยนแอปไปใช้เบราว์เซอร์เริ่มต้น ห้ามใช้ WebView

หากต้องการชี้แจงเพิ่มเติมนี่คือคำพูดจากส่วนนี้ของร่างก่อนหน้าของลิงก์แนวทางปฏิบัติที่ดีที่สุดที่ให้ไว้ด้านบน

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

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

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

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

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

เนื่องจากข้างต้นไม่แนะนำให้ใช้ User-agent แบบฝังยกเว้นในกรณีที่แอปของบุคคลที่หนึ่งที่เชื่อถือได้ทำหน้าที่เป็นตัวแทนผู้ใช้ภายนอกสำหรับแอปอื่น ๆ หรือให้การลงชื่อเพียงครั้งเดียวสำหรับแอปของบุคคลที่หนึ่งหลายแอป

เซิร์ฟเวอร์การให้สิทธิ์ควรพิจารณาดำเนินการเพื่อตรวจจับและบล็อกการเข้าสู่ระบบผ่านตัวแทนผู้ใช้แบบฝังที่ไม่ใช่ของตนเอง

นอกจากนี้ยังมีประเด็นที่น่าสนใจบางประการที่นี่: /security/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the- ก


3
Google กำลังยกเลิกการสนับสนุน webview ในวันที่ 20 เมษายน 2017 developers.googleblog.com/2016/08/…
Matt C

FYI เอกสารอ้างอิงในการเริ่มต้นของคำตอบนี้หากไม่ได้ร่างอีกต่อไป OAuth 2.0 สำหรับ Native Apps - tools.ietf.org/html/rfc8252
Kostiantyn Sokolinskyi

ขอบคุณ @KostiantynSokolinskyi แก้ไขตามด้วยลิงก์สำหรับ rfc ซึ่งไม่มีร่างอีกต่อไป
Matt C

@MattC วิธีที่ดีที่สุดในการดำเนินการลงทะเบียนผู้ใช้ใหม่คืออะไร? เราควรทำภายในแอพหรือใน IDP? เป็นไปได้ไหมที่จะเข้าสู่ระบบอัตโนมัติในการลงทะเบียนผู้ใช้? stackoverflow.com/questions/60187173/…
Yashvit

ขออภัยฉันสับสนเกี่ยวกับรายละเอียดบางอย่าง ... คุณช่วยดูได้ไหม ขอบคุณ! link ---> stackoverflow.com/q/61313694/4619958
ch271828n

25

น่าเสียดายที่ฉันไม่คิดว่าจะมีคำตอบที่ชัดเจนสำหรับคำถามนี้ อย่างไรก็ตามนี่คือตัวเลือกที่ฉันระบุ:

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

    • การใช้งานหรือนโยบายความปลอดภัยห้ามไม่ให้ใส่รหัสผ่านโดยตรงที่แอป
    • กระบวนการรับรองความถูกต้องถูกมอบหมายบนผู้ให้บริการข้อมูลประจำตัวภายนอกและต้องดำเนินการผ่านโฟลว์ที่ใช้การเปลี่ยนเส้นทาง HTTP (เช่น OpenID, SAMLP หรือ WS-Federation)
  • หากการใช้งานของการไหลของเบราว์เซอร์จะต้องจากนั้นใช้รหัสการให้สิทธิ์การไหล คำจำกัดความของสิ่งredirect_uriนี้เป็นความท้าทายที่สำคัญซึ่งมีตัวเลือกดังต่อไปนี้:

    • ใช้เทคนิคที่อธิบายไว้ในhttps://developers.google.com/accounts/docs/OAuth2InstalledAppโดยที่พิเศษredirect_uri(เช่นurn:ietf:wg:oauth:2.0:oob) ส่งสัญญาณไปยังจุดสิ้นสุดการให้สิทธิ์เพื่อแสดงรหัสการให้สิทธิ์แทนการเปลี่ยนเส้นทางกลับไปที่แอปไคลเอ็นต์ ผู้ใช้สามารถคัดลอกโค้ดนี้ด้วยตนเองหรือแอปสามารถลองรับจากชื่อเอกสาร HTML
    • ใช้ localhostเซิร์ฟเวอร์ที่อุปกรณ์ (การจัดการพอร์ตอาจไม่ใช่เรื่องง่าย)
    • ใช้โครงร่าง URI ที่กำหนดเอง (เช่น myapp://... ) ซึ่งเมื่อ dereferenced ทริกเกอร์ "ตัวจัดการ" ที่ลงทะเบียน (รายละเอียดขึ้นอยู่กับแพลตฟอร์มมือถือ)
    • หากมีให้ใช้ "มุมมองเว็บ" แบบพิเศษเช่นWebAuthenticationBrokerบน Windows 8 เพื่อควบคุมและเข้าถึงการตอบสนองการเปลี่ยนเส้นทาง HTTP

หวังว่านี่จะช่วยได้

เปโดร


ขอบคุณเปโดรสำหรับข้อมูล!. ใช่ดูเหมือนว่า Authorization Code Flow ที่มีรูปแบบ URI ที่กำหนดเองหรือ Web View จะเป็นตัวเลือกที่ดีที่สุดที่นี่
Pablo Cibraro

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

ขอบคุณ Dominick! ลูกค้าของฉันใช้ ADFS เพื่อพิสูจน์ตัวตนผู้ใช้ดังนั้นพวกเขาจึงต้องการป้อนข้อมูลรับรองในหน้าเข้าสู่ระบบ มุมมองเว็บจะใช้งานได้
Pablo Cibraro

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

1
โดยปริยายไม่รองรับการรีเฟรชโทเค็น OOB ในสถานการณ์ของ Pablo - ฉันอยากจะแนะนำการไหลของ RO อย่างชัดเจน ดูเหมือนแอปที่ บริษัท นำไปใช้กับแบ็กเอนด์ของ บริษัท เดียวกัน
lessprivilege

9

TL; DR:ใช้ Authorization Code Grant กับPKCE

1. ประเภทการให้สิทธิ์โดยปริยาย

ประเภทการให้สิทธิ์โดยนัยค่อนข้างเป็นที่นิยมสำหรับแอปบนอุปกรณ์เคลื่อนที่ แต่มันไม่ได้หมายถึงการใช้แบบนี้ มีข้อกังวลด้านความปลอดภัยเกี่ยวกับการเปลี่ยนเส้นทาง Justin Richer กล่าวว่า :

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

และเมื่อรวมกับข้อเท็จจริงที่ว่าจะไม่ให้คุณรีเฟรชโทเค็นการเข้าถึงควรหลีกเลี่ยง

2. รหัสการให้สิทธิ์ประเภทการให้สิทธิ์

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

เราขอแนะนำให้ใช้ App Access Token จากเซิร์ฟเวอร์ของแอปโดยตรงเท่านั้นเพื่อให้เกิดความปลอดภัยที่ดีที่สุด สำหรับแอพที่มาพร้อมเครื่องเราขอแนะนำให้แอปสื่อสารกับเซิร์ฟเวอร์ของคุณเองและเซิร์ฟเวอร์จากนั้นส่งคำขอ API ไปยัง Facebook โดยใช้ App Access Token

ไม่ใช่ทางออกที่ดี แต่มีวิธีใหม่ที่ดีกว่าในการทำ OAuth บนอุปกรณ์มือถือ: รหัสพิสูจน์สำหรับการแลกเปลี่ยนรหัส

3. Authorization Code Grant Type with PKCE (Proof Key for Code Exchange)

เทคนิคใหม่ถูกสร้างขึ้นเพื่อให้คุณใช้ Authorization Code ได้โดยไม่ต้องใช้ความลับของไคลเอ็นต์ คุณสามารถอ่านRFC 7636ฉบับเต็มหรือบทนำสั้น ๆนี้

PKCE (RFC 7636) เป็นเทคนิคในการรักษาความปลอดภัยไคลเอนต์สาธารณะที่ไม่ใช้ความลับไคลเอนต์

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

จากhttps://oauth.net/2/pkce/


-4

การใช้ Webview ในแอปพลิเคชันมือถือของคุณควรเป็นวิธีที่เหมาะสมในการใช้งานโปรโตคอล OAuth2.0 บนแพลตฟอร์ม Android

สำหรับฟิลด์ redirect_uri ฉันคิดว่าhttp://localhostเป็นทางเลือกที่ดีและคุณไม่จำเป็นต้องพอร์ตเซิร์ฟเวอร์ HTTP ภายในแอปพลิเคชันของคุณเพราะคุณสามารถแทนที่การนำonPageStartedฟังก์ชันไปใช้งานในWebViewClientคลาสและหยุดการโหลดหน้าเว็บได้http://localhostหลังจากที่คุณตรวจสอบurlพารามิเตอร์

public void onPageStarted(final WebView webView, final String url,
        final Bitmap favicon) {}

3
แนวทางปฏิบัติที่ดีที่สุดสำหรับ Native Apps ที่ใช้ OAuth2: tools.ietf.org/html/draft-wdenniss-oauth-native-apps
Matt C

1
ดังที่ Matt C กล่าวไว้ข้างต้น การดูเว็บเป็นแนวคิดที่ไม่ดีสำหรับแอปบนอุปกรณ์เคลื่อนที่ซึ่งไม่ปลอดภัยอนุญาตให้แอปเข้าถึงข้อมูลรับรอง (จึงไม่ปลอดภัยไปกว่า RO) และไม่อนุญาตให้ผู้ใช้ยืนยันโดเมนและใบรับรอง TLS ใช้ประเภทการให้สิทธิ์ Auth Code กับตัวจัดการ URI ที่กำหนดเองและตรวจสอบให้แน่ใจว่าคุณใช้Proof Code for Key Exchange (PKCE)เพื่อหยุดแอปที่เป็นอันตรายในโทรศัพท์ของคุณที่สกัดกั้นรหัสรับรองความถูกต้องและเข้าถึง API ของคุณ
ChrisC

2
เอกสารแนวทางปฏิบัติที่ดีที่สุดฉบับร่าง OAuth 2.0 สำหรับ Native Apps อยู่ที่tools.ietf.org/html/draft-ietf-oauth-native-apps
Jeff Olson

-5

ประสบการณ์ของผู้ใช้ที่ราบรื่นที่สุดสำหรับการตรวจสอบสิทธิ์และวิธีที่ง่ายที่สุดในการนำไปใช้คือการฝัง Webview ในแอปของคุณ ประมวลผลการตอบกลับที่ได้รับจาก webview จากจุดตรวจสอบสิทธิ์และตรวจหาข้อผิดพลาด (การยกเลิกของผู้ใช้) หรือการอนุมัติ (และแยกโทเค็นจากพารามิเตอร์การสืบค้น URL) และฉันคิดว่าคุณทำได้จริงในทุกแพลตฟอร์ม ฉันทำงานนี้สำเร็จแล้ว: ios, android, mac, แอพ windows store 8.1, แอพ windows phone 8.1 ฉันทำสิ่งนี้เพื่อบริการต่อไปนี้: dropbox, google drive, onedrive, box, basecamp สำหรับแพลตฟอร์มที่ไม่ใช่ windows ฉันใช้ Xamarin ซึ่งคาดว่าจะไม่เปิดเผย API เฉพาะแพลตฟอร์มทั้งหมด แต่ก็เปิดเผยเพียงพอสำหรับการทำให้เป็นไปได้ ดังนั้นจึงเป็นโซลูชันที่เข้าถึงได้ง่ายแม้จะมองจากมุมมองข้ามแพลตฟอร์ม


ในขณะที่มอบประสบการณ์การใช้งานที่สะดวกสบายแก่ผู้ใช้ แต่เราจะเห็นว่าอุตสาหกรรมนี้ถอยห่างจากแนวทางนี้ เมื่อการดูเว็บเปิดความเป็นไปได้ในการบุกรุกรหัสผ่านเมื่อฉันถูกขอข้อมูลรับรองจากตัวแทนผู้ใช้ที่ฝังตัวฉันจะถอนการติดตั้งแอป ขณะนี้ API บางตัวยังแบนการผสานรวมเช่นนี้dev.fitbit.com/docs/oauth2
Matt C

แนวทางปฏิบัติที่ดีที่สุดสำหรับ Native Apps ที่ใช้ OAuth2: tools.ietf.org/html/draft-wdenniss-oauth-native-apps
Matt C

ฉันไม่เห็นว่าบริการที่เปิดใช้งาน oauth จะห้ามแนวทางนี้ได้อย่างไร ไม่สามารถตรวจจับได้และปลอดภัย ... บริการที่เปิดใช้งาน oauth บางอย่างให้บริการไคลเอนต์เฉพาะแพลตฟอร์มเพื่อให้การรับรองความถูกต้องง่ายขึ้นและลูกค้าดังกล่าวจะทำตามที่ฉันอธิบายไว้ที่นี่ (แสดงมุมมองเว็บที่ฝังไว้และติดตามการเปลี่ยนแปลง URL) แนวทางปฏิบัติที่ดีที่สุดที่คุณเชื่อมโยงแนะนำสิ่งเดียวกัน: ใช้เบราว์เซอร์ระบบหรือมุมมองเว็บแบบฝัง คุณโจมตีข้อโต้แย้งอะไรจากคำตอบของฉัน มันไม่ชัดเจน
Radu Simionescu

ไม่ได้มีจุดมุ่งหมายในการโจมตีเพียงเน้นประเด็น ลิงก์ระบุว่ามี 2 แนวทางที่คุณกล่าวถึง แต่มีเพียง user-agent ภายนอกเท่านั้นที่ถือว่าปลอดภัยโดยเฉพาะระบุว่าตัวเลือกสำหรับ Native apps คือ "ผ่าน user-agent แบบฝังหรือ user-agent ภายนอกเอกสารนี้แนะนำภายนอก user-agent เช่นแท็บเบราว์เซอร์ในแอปเป็นทางเลือกเดียวที่ปลอดภัยและใช้งานได้สำหรับ OAuth "
Matt C

คำพูดเพิ่มเติม "ในการใช้งานตัวแทนผู้ใช้แบบฝังในมุมมองเว็บโดยทั่วไปแอปพลิเคชันโฮสต์สามารถ: บันทึกการกดแป้นพิมพ์ทุกครั้งที่ป้อนในแบบฟอร์มเพื่อบันทึกชื่อผู้ใช้และรหัสผ่านส่งแบบฟอร์มและข้ามการยินยอมของผู้ใช้โดยอัตโนมัติ" ....... "ไม่แนะนำให้ใช้ User-agent แบบฝังตัวยกเว้นในกรณีที่แอปของบุคคลที่หนึ่งที่เชื่อถือได้ทำหน้าที่เป็นตัวแทนผู้ใช้ภายนอกสำหรับแอปอื่น ๆ หรือให้การลงชื่อเพียงครั้งเดียวสำหรับแอปของบุคคลที่หนึ่งหลายแอปเซิร์ฟเวอร์การอนุญาตควรพิจารณาดำเนินการตามขั้นตอนเพื่อ ตรวจจับและบล็อกการเข้าสู่ระบบผ่านตัวแทนผู้ใช้แบบฝังที่ไม่ใช่ของตนเองหากเป็นไปได้ "
Matt C
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.