รู้จัก OAuth 2.0 กันก่อน

ก่อนจะเข้าเนื้อหาจะขอเล่าน้ำสักบทนึงก่อนนะครับ คิดอยู่ว่าจะทำยังไงให้เข้าใจเรื่องนี้โดยไม่มีศัพท์เทคนิค เพื่อให้ได้ความรู้และคุยกับเพื่อนร่วมงาน, Partner ได้เข้าใจ จะได้วางแผนงานและแบ่งงานกันรู้เรื่อง เพราะประสบการณ์ที่ผ่านมามักจะมาแนวว่า “Authentication ใช้ OAuth ละกัน ปลอดภัยดี ดูมีมาตรฐาน” ว่าแต่จริงๆแล้ว OAuth มันคืออะไรล่ะ Dev รู้จักมันจริงไหม, IT Operation บริหารจัดการมันได้ดีแค่ไหน Authen ไม่ผ่านต้องทำอย่างไร, Attibute อะไรที่ใช้บ้าง, Protocol เองก็เก่ง ทำได้เยอะ mode เหลือเกิน ทำแบบไหนดี เลยอยากจะเล่าที่มาที่ไปของมันก่อน เพื่อให้เห็นกรอบการทำงานของมันเพื่อให้ทุกคนอ่านแล้วเห็นภาพเดียวกัน แล้วในบทความต่อๆไป จะค่อยๆอธิบายรายละเอียดการทำงานของ Protocol ยันการเขียน Application เพื่อทดสอบเชื่อมต่อไปเลย สำหรับเฉพาะกลุ่มหรือคนที่ต้องการลงรายละเอียดจริงๆมาอ่าน และได้ประโยชน์

 

            เริ่มเข้าเนื้อหาละกันนะครับ หลายๆ คนน่าจะเคยได้ยินประโยคประมาณว่า “Authen ด้วย OAuth นะ” ก็อาจจะทำให้หลายๆคนเข้าใจกันไปว่า OAuth มันน่าจะเป็น Protocol ที่ใช้ในการ Authentication (ยืนยันตัวตน) แบบพวก Radius, LDAP Binding เป็นต้น แต่ในความจริงแล้ว OAuth สามารถทำอะไรได้มากกว่าการ Authentication ในบทความนี้จะขอแชร์ในส่วนของ OAuth 2.0 ก่อนนะครับ เพื่อจะได้เข้าใจการทำงานของมันก่อน

             OAuth มีมาเพื่อแก้ปัญหาอะไร ลองนึกดูว่าถ้าเรา Login Google / Facebook ค้างอยู่ มันจะเป็นยังไง ถ้าเราต้องการจะ Post รูปผ่าน Instragram ด้วย พร้อมกัน, Share link ใน Wall ของ Facebook ไปยัง App อื่นๆ แล้วสามารถใช่งานได้ทันที เหมือนเป็น Account เดียวกัน พวกนั้นทำงานผ่าน OAuth 2.0 ทั้งนั้น ซึ่งถ้าจะพูดกันง่ายๆ OAuth 2.0 นั้นทำอยู่สองอย่าง

1. Federation Identity ช่วยให้ user สามารถ login เข้าใช้งาน application ได้โดย account อื่นๆ เช่น สามารถ login pinterest โดยใช้ Twitter account ได้, เข้า Google Account ในการเข้า StackOverFlow เป็นต้น

2. Delegate Authority ยอมให้ user สามารถใช้สิทธิในการเข้าถึง Resource ของ Services อื่น ได้โดยใช้สิทธิของ user คนนั้น เช่น สามารถ Share รูปใน Instragram จาก Facebook account ได้ เป็นต้น

เรื่องของ Federation Identity ลองคิดเล่นๆ ถ้าเราไม่มี OAuth โลก internet จะเป็นแบบไหน ลองดูตาม Flow นี้ดูครับ

Flow แบบไม่มี OAuth

           จากรูป Mr.A ต้องการขอ Contact จาก Google ผ่าน MyApp จะเห็นว่า วิธีการดูแล้วไม่น่าเชื่อถือเลย ตั้งแต่ส่ง Credential ของ Google ผ่านไปยัง Application อื่น แล้วมันจะถูกบันทึกไว้ไหม, Contact ที่ได้จาก Google ก็ต้องผ่าน MyApp ก่อน เหมือน Proxy แล้วมันจะถูก Capture ไว้ไหม จะ Credential จะถูกเอาไปใช้งานซ้ำได้อีกไหม จะตรวจสอบอย่างไร คิดๆ ละอย่าใช้เลย เพราะท่าทางปัญหามันจะมากกว่า productivity ละครับ

แล้วแบบนี้ถ้ามี OAuth มันจะเป็นแบบไหนล่ะ ลองดู Flow ตามนี้ครับ

Flow แบบใช้งาน OAuth

            จากรูปจะเห็นว่า Mr.A จะ Redirect เพื่อเชื่อมต่อไปยัง Google โดยตรง, เราจะใช้ Credential กับระบบงานที่เป็น Identity Source เท่านั้น และข้อมูลจะถูกส่งมาตรงๆ ที่เราแล้วเอาไปใช้งานต่อ แทนที่จะผ่าน Proxy ในระบบอื่นๆ แค่นี้ Security ก็ดีขึ้นมาแบบเทียบกันไม่ได้ รวมถึงไม่จำเป็นต้องมีการ maintain ในเรื่อง identity ข้ามกันระหว่าง Service อีกต่างหาก ดูดีขึ้นเยอะครับ

             จากตัวอย่างเริ่มที่จะเห็นประโยชน์ละใช่ไหมครับ ดังนั้น OAuth จึงถูกสร้างขึ้นมาเพื่อแก้ไขปัญหาต่างๆ เหล่านี้ เนี่ยละโดย OAuth 2.0 (ขอข้าม version เก่าๆไปนะครับ เพราะปัจจุบันนิยมใช้ OAuth 2.0 กันมากกว่า คร่าวๆ คือ OAuth 1.0 จะหลักการคล้าย OAuth 2.0 แต่จะซับซ้อนกว่า ซึ่งก็แน่นอนมัน Secure กว่า OAuth 2.0 ตามไปด้วย แต่ไม่ยืดหยุ่น เลยค่อนข้างจะวุ่นวาย) เป็น Protocol ที่ได้รับความนิยมอย่างมาก โดยเฉพาะบรรดา Social network ต่างๆที่ให้บริการกับผู้ใช้จำนวนมาก เช่น Facebook, Google เป็นต้น OAuth 2.0 ออกแบบเพื่อเป็น “Authorization Framework” ตาม RFC6749 (https://tools.ietf.org/html/rfc6749)  ซึ่งช่วยให้ User สามารถใช้ Credential (อาจจะ user / password) จาก Web หนึ่งเข้าถึง Service อื่นๆ อาจจะเป็น Web หรือ Mobile Application ได้ โดยที่ Resource ปลายทาง ไม่จำเป็นต้องมี Credential ของ user คนนั้นอยู่เลย นั่นหมายความว่า OAuth สามารถนำไปใช้งานได้ทั้ง Authentication (การยืนยันตัวตน) และ Authorization (การยืนยันสิทธิ) โดยการทำ Authentication ของ OAuth 2.0 นั้น จะใช้ protocol ที่เรียกว่า OpenID Connectหรือ (OIDC) ในการทำ Authentication ดังนั้นเมื่อไรที่เราทำ Authentication โดยใช้ OAuth 2.0 แปลว่าเรากำลังใช้ OIDC อยู่นะครับ 🙂

             OpenID Connect (OIDC)  เป็นส่วนหนึ่งของ OAuth 2.0 โดยที่ใช้กันอยู่ในปัจจุบัน คือ OIDC v1.0 version ก่อนหน้านี้คือ OpenID 2.0 โดยหลักการทำงานจะคล้ายกัน แต่ OIDC จะมี API ที่ใช้ง่ายกว่า,ใช้กับ mobile ได้ดีกว่า และทำงานร่วมกับ OAuth 2.0 ด้วยตัว protocol เองเลย ไม่ต้องมี extension อะไรมาเสริม โดยมีวัตถุประสงค์เพื่อช่วยให้สามารถใช้ Credential จาก Web นึงในการเข้าใช้บริการของอีก Web Site นึงได้ โดยผู้ใช้งานมี Credentail เพียง Web Site เดียว เพื่อลดการ manage password ข้าม Web Site โดยในตัวของ Protocol ยังมีกระบวนการ verification เพื่อทวนสอบในมุมมองของ Security ด้วย ว่าผู้ใช้งานใช้ Browser, Mobile, Javascript client อะไร ทำการเชื่อมต่อมายัง Application ของเรา รวมถึงมี Optional features เช่นเข้ารหัส Identity data, Discovery OpenID provider และ Session Managment ได้อีกด้วย

บทนี้ขอจบดื้อๆแบบนี้ก่อนนะครับ จะได้ไม่หนักหัวมาก บทความต่อๆ ไปจะอธิบายแบบลงรายละเอียดต่างๆให้มากขึ้น มี Component อะไรบ้าง ทำงานอย่างไร เป็นต้นครับ

reference : http://openid.net/connect/

OpenID Connect FAQ and Q&As


https://en.wikipedia.org/wiki/OAuth


Leave a Reply