OAuth

OAuth นี้ไม่ได้เกี่ยวกับ thesis ของผมตรงๆ เพียงแต่เอามาใช้เพื่อช่วยทำการทดลอง!!! … คล้ายๆ ว่าผมไม่ได้ทำ thesis เกี่ยวกับ operating system หรือว่า shell อะไรทำนองนั้น แต่ผมก็ต้องใช้ gnu/linux เป็นบ้าง ไม่เช่นนั้นก็ไม่รู้ว่าจะเอาโปรแกรมมาทำงานอย่างไร.

คราวที่แล้วเขียนถึง Basa API ไป. Basa API ที่มีอยู่ตอนนี้ก็ทำไปเรื่อยๆ ให้ใช้ได้ก่อน ยังไม่ได้ทำให้มีระบบ access control และ authentication.

แต่ถ้าหากว่าต้องมี authentication ขึ้นมาล่ะจะต้องทำอย่างไร … ผมก็ไม่ได้ survey มาดิบดีอะไร. ก็มาจาก OAuth หลังจากที่ตามไปอ่าน Hi5 API และ Open Social ก็เจอ OAuth ก็คิดว่าน่าจะเอามาใช้ได้ อย่างน้อยๆ user ก็ไม่ต้องปล่อย password ไว้ทั่วไปหมด. น่าจะเป็นไปได้ user ไป register service ตัดคำของชาวบ้านไว้ แต่อยากจะใช้งานกับ BasaAsa ก็อาจจะร่วมกันได้เลย.

ผมรู้สึกว่าเรื่องของ OAuth อ่านยากอยู่นิดๆ ผมมาอธิบายอีกทีก็ไม่รู้เข้าจะถูกหรือเปล่า หรือจะอธิบายรู้เรื่องหรือเปล่า แต่ก็จะอธิบาย! …

ตัวอย่างของ OAuth ที่จำมา จาก slide และ web ประมาณว่าเราเอารูป upload ขึ้นไปไว้ที่ flickr (หรือ picasa หรืออะไรอื่นๆ) แต่รู้นี้เราไม่ได้อนุญาติให้คนอื่นดูได้ แต่พอดีอยากจะสั่ง print จากร้านที่ไม่ใช่ flickr นะ อันนี้ก็เป็นปัญหาขึ้นมาจะให้ username และ password ของเราไปที่ร้าน print รูปเลยก็ใช่ที่.

แต่ก่อนจะไปมากกว่านี้ดู definition ก่อนดีกว่า ในกรณีข้างบน

  • รูปที่จะสั่ง print คือ protected resources
  • เราเป็น user
  • ร้านที่จะ print รูปเป็น customer
  • ส่วน flickr หรือ web อะไรที่เราเก็บรูปเอาไว้เป็น service provider
  • อีกคำหนึ่งที่ไม่มีในตัวอย่างคือ Token ประมาณเป็นสัญลักษณ์ หรือถ้าจะนึกให้เห็นภาพหน่อย ก็เป็น เหรียญ ที่มีลักษณะ เฉพาะที่ระบุเจ้าของได้ ประมาณว่า เห็นเหรียญนี้แล้วรู้เลยว่า มาจาก flickr แล้วเป็นเหรียญที่ให้ร้าน print รูปไว้ประมาณนั้น

ขั้นตอนที่ผมเข้าใจคือ

  1. service provider ให้ token (เหรียญที่มีหน้าตาเฉพาะ) ไว้กับ customer … แน่นอน service provider จะได้ว่าเหรียญนี้ให้ customer ไว้ สิ่งนี้เรียกว่า request token (ก่อนจะให้ customer ก็ต้องขอไปก่อนอะนะ)
  2. จากนั้น customer ก็จะ redirect ไปที่หน้าของ service provider พร้อมกับส่ง request token ไปด้วย. ในหน้านี้เอง user จะกรอก username และ password ให้ service provider ดังนั้น customer ก็จะไม่ได้ username และ password เลย. สิ่งที่ได้คือ request token นี้จะเอาไป access token ได้ (ถ้า user ใส่ username และ password ถูก)
  3. customer ขอ access token จาก service provider โดยใช้ request token
  4. พอ customer ได้ access token มาก็เอา access token ไปขอ protected resources จาก service provider ได้ ก็เป็นอันจบกระบวนการ

พอได้ access token มานี้ก็เอา access token มาใส่ใน http header ตรง WWW-Authenticate แทน Basic access authentication ที่ส่ง username และ password ได้ … ชอบแบบนี้เพราะมันเข้ากับ HTTP ได้เนียนดี. แต่ก็อาจจะมีปัญหา man in the middle attack อยู่ ประมาณว่าอาจจะโดนขโมย token ไปกลางทาง แต่ว่าก็มีวิธีแก้ เช่น ใช้ผ่าน SSL แต่ว่าใช้ผ่าน SSL ก็เป็นวิธีที่ไม่ค่อยมีประสิทธิภาพเท่าไหร่ เปลืองทั้ง bandwidth และพลังที่ใช้คำนวณ … ก็มีวิธีอื่นอีกคือส่ง digital signature ของ request ไปด้วย เพื่อยืนยันว่าเป็น customer ตัวจริง … มีเรื่อง timestamp กับ nonce อะไรด้วย เพื่อป้องกัน replay attack แต่ผมก็ยังงงๆ อยู่ ไว้เขียน ใน entry ต่อไป (หรือไม่เขียนถึงเลย) ดีกว่า.

อ้างอิง
http://oauth.net/
oauth4r slide
oauth slide
http://cakebaker.42dh.com/2008/09/01/using-oauth-enabled-apis-with-cakephp/

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s