I'm a Ruby on Rails / jQuery web developer. Follow me at @sikachu

เจออะไรใน 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 ของคุณให้เป็นข้อความยากๆ ที่เดาไม่ได้นะครับ :D

แล้วถ้ามีการแก้ไข cookie ที่ถูกเข้ารหัสละ?

มันก็จะ verify cookie ไม่ผ่าน แล้วก็จะโยน exception ActiveSupport::MessageVerifier::InvalidSignature มาครับ

ยังมีอะไรอีกเพียบเลยครับที่ยังเหลือให้เขียนถึง อย่าลืมติดตามอ่านตอนต่อๆ ไปนะครับ :D

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