เจออะไรใน Rails 3: เข้ารหัส cookie และสร้าง cookie ที่ไม่มีวันหมดอายุอย่างง่ายๆ
February 11th, 2010 Posted in Ruby, Ruby on Railsเจออะไรใน Rails 3 เป็นสกู๊ปพิเศษสำหรับนำเสนอสิ่งใหม่ๆ ที่จะมีเพิ่มขึ้นมาใน Ruby on Rails 3.0
เมื่อก่อนนี้ ถ้าหากเราต้องการที่จะทำ cookie ที่ไม่มีวันหมดอายุ (เช่น remember me) เราจำเป็นที่จะต้องกำหนดเวลาหมดอายุของ cookie เอง เช่น
cookies[:authorization_key] = { :value => @user.authorization_key, :expires => 20.years.from_now.utc }
แต่หลังจาก commit ของ DHH อันนี้ ทำให้เราสามารถเขียนใหม่ได้เป็น
cookies.permanent[:authorization_key] = @user.authorization_key
นอกจากนั้น เพื่อเพิ่มความปลอดภัยให้กับ Cookie เราก็ยังสามารถที่จะจับมัน signed หรือพูดง่ายๆ ก็คือเข้ารหัสมันไว้ได้ โดยการใช้เมธอด signed
cookies.signed[:user_id] = @user.id
ที่เยี่ยมไปกว่านั้นคือ การที่ทั้งสองเมธอดนั้นสามารถเชื่อมต่อกันได้ เพราะฉะนั้นตัวอย่างข้างต้นสำหรับ remember me นั้น เราก็สามารถแก้โค้ดให้เป็น
cookies.signed.permanent[:authorization_key] = @user.authorization_key
ซึ่งจะทำให้ cookies[:authorization_key] นั้นถูกเข้ารหัสก่อนที่จะส่งไปยัง web browser
แล้วมันเข้ารหัสกับอะไรล่ะ?
เป็นคำถามที่ดีครับ! Application ใหม่ๆ ที่ถูกสร้างมานั้นจะมีไฟล์ชื่อ cookie_verification_secret.rb อยู่ใน config/initializer ซึ่งมันจะมี key ที่ใช้ในการเข้ารหัสเมื่อใช้คำสั่ง cookies.signed อยู่ เพราะฉะนั้นถ้าเป็น application เก่า สิ่งที่คุณต้องทำก็แค่สร้างไฟล์นี้ขึ้นมาแล้วเพิ่มบรรทัดนี้
ActionController::Base.cookie_verification_secret = 'z3cret';
อย่าลืมเปลี่ยน token ของคุณให้เป็นข้อความยากๆ ที่เดาไม่ได้นะครับ
แล้วถ้ามีการแก้ไข cookie ที่ถูกเข้ารหัสละ?
มันก็จะ verify cookie ไม่ผ่าน แล้วก็จะโยน exception ActiveSupport::MessageVerifier::InvalidSignature มาครับ
ยังมีอะไรอีกเพียบเลยครับที่ยังเหลือให้เขียนถึง อย่าลืมติดตามอ่านตอนต่อๆ ไปนะครับ



Sorry, comments for this entry are closed at this time.