วันเสาร์ที่ผ่านมาทุ่มเวลาไปทั้งวันกับการค้นหาวิธี oauth แบบไม่ต้อง Redirect ไปยังหน้าเว็บ Twitter เพื่อ Allow Request สุดท้ายก็ทำได้ด้วยการไปอ่าน Source ภาษา Python, Ruby และ PHP (ที่เขียนซับซ้อนเหลือเกิน) รวมถึงทำ Packet Sniff เพื่อตรวจจับผลการทำงาน เรียกได้ว่าบ้ามาก -*- ไม่เข้าใจว่าทำไมหาวิธีแบบที่เป็น Document ยากเหลือเกิน ต้องมานั่งแกะเนี่ย!! แต่สุดท้ายก็หา Algorithm ออกมาได้
ก่อนอื่นต้องเขียนก่อนว่าทำไมถึงต้องใช้ oauth และ Flow oauth จริงๆมันเป็นยังไงและสุดท้ายทำไมถึงต้องมาทำวิธี xauth
การเข้าถึงบริการ Twitter ผ่าน Twitter API ด้วยวิธี Auth แบบต่างๆ
Basic Auth
จริงๆเราใช้งาน Twitter API มานานมากแล้ว แต่สังเกตว่าทุกทวีตที่ทวีตมาจากเรานั้นจะขึ้นว่า from API ตลอด ก็เพราะว่าเราเข้าถึง Twitter API แบบตรงๆผ่าน Basic Auth นั่นเอง
ซึ่งการเรียกใช้ API ผ่าน Basic Auth มีข้อดีที่ว่าทุกอย่างช่างแสนง่ายดาย แค่ส่ง Username และ Password ที่ง่ายๆผ่านวิธี Basic Authentication บน Header แค่นี้ก็โพสท์ได้แล้ว แต่ผลที่แลกมาซึ่งความง่ายคือนอกจากจะแฮคง่ายแล้วทวีตยังจะขึ้นว่า from API อีกด้วย น่าเศร้า!!
แต่เพื่อให้ข้อมูลถูกต้องยิ่งขึ้นต้องบอกก่อนว่า จริงๆแล้ว Basic Auth ก่อนหน้านี้ก็สามารถขึ้นว่า from XXX ได้เหมือนกัน โดยจะมี Parameter ที่ชื่อว่า Source เพื่อบ่งบอกว่าส่งมาจาก App ตัวไหน เพียงแต่ตั้งแต่ Twitter ตัดสินใจย้ายมาใช้ OAuth ตรงนี้ก็ถูกยกเลิกไป แต่สำหรับคนที่ได้สร้าง App ไว้ก่อนหน้านี้ก็ยังสามารถใช้วิธีเดิมได้ต่อไป ส่วนเราเป็นมือใหม่ก็เลยอด...
แล้วจะทำยังไงให้มันขึ้นว่า from XXX (โดย XXX คือชื่อ App ที่เรากำหนดเอง) ได้หละ? ทางออกคือ OAuth นั่นเอง
OAuth
วิธี OAuth นี้เป็นวิธีที่ Twitter หวังว่าจะใช้ทดแทน Basic Auth ในอนาคต(อันไกล) โดยมี Flow ที่ค่อนข้างซับซ้อนยุ่งยากดังนี้
กว่าเราจะเข้าใจก็ใช้เวลาเป็นนาทีเลยแหละ... ล้อเล่น จริงๆหลายชั่วโมงเลย แหะๆ ^^"
หลักๆคือเวลาเราจะใช้ OAuth เราจะต้องกดใช้จากเว็บที่จะใช้บริการกับ Twitter (ขอยกเว้นในกรณีเป็น Client App ไปก่อนนะ) แล้วระบบจะไปขอ Request Token ผ่านบริการ request_token และเมื่อได้ Token มาก็จะ redirect ไปยังหน้า authenticate ของ Twitter ว่าจะ Allow รึเปล่า
เมื่อกด Allow มันก็จะ Redirect กลับไปยังเว็บเดิมเพื่อไปขอ Access Token ผ่าน access_token และจึงนำ Access Token นี้ไปใช้ในบริการผ่าน Twitter API อีกทีนึง
ซึ่งขั้นตอนเหล่านี้ถือว่าวุ่นวายมากเพราะมี Parameter ต้องส่งไปมหาศาลแถมคำนวณยุ่งยากพุ่งพรวดอีก
ยากแสรด!!!
สำหรับ Flow นี้เราเข้าใจและทำได้แล้วหละ แต่ปัญหาคือสำหรับ Mobile Client หรือพวกระบบ Tweet จากเว็บที่เราไม่สามารถให้ User ไปกด Allow ในเว็บได้หละ จะทำยังไงดี??? ทางออกคือ XAuth... (จะมีอะไรเยอะแยะฟระ!)
XAuth
จริงๆมันก็คือ OAuth นั่นแหละ แต่มันมีความต่างนิดหน่อยเลยขอใช้ชื่อเรียกว่า XAuth ละกัน
สิ่งที่ต่างหลักๆของ XAuth คือ Flow ที่ลดลงไปเหลือขั้นตอนเดียวและ Parameter ที่เพิ่มขึ้นเล็กน้อย ดังนี้
(1) ส่งไปขอ Access Token ที่ URL https://api.twitter.com/oauth/access_token พร้อมกับ parameter มาตรฐานในการทำ OAuth ผนวกเพิ่มไปอีก 3 Parameters ใน POST Body ได้แก่ x_auth_type, x_auth_username และ x_auth_password... นั่นคือสาเหตุว่าทำไมถึงต้องเป็น https เนื่องจากมีการส่ง Password ไปด้วยนั่นเอง
(2) เมื่อได้รับ Access Token ก็สามารถนำไปใช้กับ Twitter API ได้ทันที
ง่ายขึ้นเยอะ!! ง่ายทั้งโปรแกรมเมอร์และง่ายทั้ง User เลย แต่วิธีนี้มีข้อเสียด้าน Privacy ว่า User ต้องใส่ Twitter Username/Password ให้ระบบเพื่อนำไปขอ Access Token ด้วยต่างกับ OAuth ที่ไม่ต้องใช้ Password เนื่องจากแทนที่ด้วยการไปกด Allow ในเว็บ Twitter นั่นเอง แต่สำหรับ Client ที่ต้องใส่ User/Pass เช่น Mobile Client อยู่แล้วก็คงไม่มีผลเสียอะไร
และนี่คือผลจากการใช้งานผ่าน XAuth
สำหรับวิธี XAuth ยังมีคนใช้ไม่เยอะ แต่ก็เริ่มมีคนใช้บ้างแล้วเช่น TweetDeck และ NuuNeoI เป็นต้น ฮ่าาาาา
ดาวน์โหลด PHP Twitter xauth Source Code
เราเขียนเป็น PHP สำหรับทวีตแบบง่ายๆไว้เรียบร้อย ใครอยากเอาไปลองใช้ ดาวน์โหลดเล้ยยย
Filename: twitterxauth.zip
Download: 1109 ครั้ง
ทั้งนี้เขียนไว้ฟังก์ชั่นเดียวคือาการ Update Status หรือการทวีตนั่นเอง ถ้าใครอยากทำอะไรมากกว่านี้ก็ Implement เพิ่มเอาเองได้เลย มีฟังก์ชั่นที่จำเป็นครบหมดแล้ว
หมายเหตุ: ทั้งนี้ต้องใช้ PHP5 และเปิด Extension OpenSSL ไว้ด้วยเท่านั้น ไม่งั้นจะรันไม่ได้
วิธีใช้ Source Code
ทำการ Register Twitter Client เพื่อกำหนด App Name และรับ Consumer Key กับ Consumer Secret ที่ http://twitter.com/apps
สั่ง include ไฟล์ twitterxauth.php ที่โหลดไป
include "twitterxauth.php";
และเรียกใช้คำสั่งดังนี้
$consumer_key = "YOUR_CONSUMER_KEY";
$consumer_secret = "YOUR_CONSUMER_SECRET";
TweetXAuth("USERNAME", "PASSWORD", "TEXT TO TWEET",
$consumer_key, $consumer_secret);
เพียงเท่านี้คุณก็สามารถทวีตโดยมีคำว่า from YOURAPPNAME โผล่ในทวีตเรียบร้อยแล้ว :D ง่ายป่ะหละ!!
ขออนุญาตใช้ API ไปที่ Twitter
ใช้ไปใช้มาอยู่ดีๆ Source Code ที่แจกไปก็ใช้งานไม่ได้ซะงั้น!! โดยขึ้นว่า