พื้นฐาน Joomla

รู้จักกันก่อนเขียนบทความ
หัวใจหลักของการทำเว็บไซต์ ก็คือการมีบทความใช่ไหมล่ะครับ การสร้างบทความก็คือการที่เราเพิ่มข้อมูล...

เทคนิค Joomla

ลืม Password Admin
Password นั้น สำหรับผู้จัดทำ Website ก็จะต้องจดจำไว้หลายชุดเหลือเกิน ไหนจะมี Password สำหรับใช...

แนะนำ Extension

ซ่อน administrator ด้วย kSecure
เทคนิคที่เคยเผยแพร่วิธีการป้องกัน Directory administrator ไปแล้วด้วยการสร้างรหัสผ่านให้กับ Dire...
( 4 Votes )
Invalid Tokenปัญหานี้ หากใครใช้ Joomla แบบทั่ว ๆ ไปก็คงไม่พบเจอกันหรอกครับ แต่มักจะพบเจอกับผู้ที่ใช้ Template Joomla แบบพิเศษ นั่นคือ อาจจะเป็น Template ที่เขาขายกัน หรืออาจจะไม่ขาย แต่มีการออกแบบนอกกรอบ นอก Core ของ Joomla เอง ซึ่งจะมีผลทำให้เมื่อเรียกใช้งานคอมโพเน้นท์หรือโมดูลบางตัว มันจะไม่ไปเรียกจาก Core ของ Joomla ที่มีอยู่แล้วโดยตรง

ปัญหานี้จะเกิดขึ้นก็ต่อเมื่อมีการร้องขอการกู้รหัสผ่าน หรือ Reset Password ของผู้ใช้งาน ซึ่งในขั้นตอนการระบุ Token หรือรหัสยืนยันนั้น หากมีการระบุ Token ผิด ก็จะปรากฏข้อความ

Your password reset comfirmation failed because the token was invalid.

ซึ่งก็แปลว่า คุณใส่รหัส Token ไม่ถูกต้อง แต่ถ้าคุณแน่ใจว่า ใส่ถูกต้องตรงเป๊ะ ขนาด Copy มา Paste แล้วมันก็ยังไม่ได้ ก็ให้คุณดู Template ของตัวเองได้เลยครับ ซึ่งปัญหานี้มักจะเกิดขึ้นกับเทมเพลตที่มีการออกแบบมาอย่างพิเศษ

เทมเพลตแบบพิเศษที่ว่า ก็มักจะถูกออกแบบมาโดยมีคอมโพเน้นท์หรือโมดูลเสริมมาในตัว Template เองด้วย เช่น มีไดเร็คทอรี่ com_contact , com_content , mod_search หรือ com_user เพิ่มเข้ามาใหม่เลย โดยจะไม่ไปเรียกใช้งานจาก Core ของ Joomla แต่จะเรียกจากส่วนที่ถูกติดตั้งเสริมมานี่แหล่ะครับ เป็นอย่างไร ไปดู

Invalid Token

จากภาพจะเห็นว่า ตอนนี้ผมกำลัง FTP ไปที่ไดเร็คทอรี่ templates/pcnott ซึ่งเทมเพลทที่ถูกออกแบบมาพิเศษ มักจะมีไดเร็คทอรี่ html เพิ่มมาด้วย อันนี้ไม่ค่อยแปลกครับ เพราะมักจะเห็นกันทั่วไปอยู่แล้ว แต่ที่แปลกคือ จะมีไดเร็คทอรี่ ที่มีชื่อเหมือนกับไดเร็คทอรี่เดิมของ Joomla ที่เคยมีอยู่แล้ว เพียงแต่ว่ามันจะถูกเก็บไว้อยู่ในไดเร็คทอรี่ templates/ เท่านั้นเอง และมันก็จะเรียกใช้งานจากตรงนี้แทนครับ ดังนั้นบางคนอาจจะแปลกใจว่า ไป Modify คอมโพเน้นท์ หรือโมดูลบางตัวแล้ว ทำไมมันไม่เปลี่ยนแปลงอะไรเลยแม้แต่นิดเดียว ถึงขนาดเปลี่ยนชื่อหรือลบไดเร็คทอรี่นั้นไปแล้ว มันก็ยังแสดงผลได้อยู่ ก็เป็นอันรู้แล้วนะครับว่า มันอาจจะดึงจากส่วนนี้มาแสดงผลแทน

จากตัวอย่างของผม จะมีไดเร็คทอรี่ต่าง ๆ อยู่ภายใน template/pcnott/html ด้วย แต่ไดเร็คทอรี่ที่เราจะแก้ปัญหา Invalid Token นี้คือ com_user ครับ เนื่อจากว่าการเพิ่มมาของคอมโพเน้นท์ user นี้ ได้ขาดสิ่งหนึ่งไประหว่างขั้นตอนการยืนยัน Reset Password

ปกติแล้ว เมื่อมีผู้ใช้งานร้องขอการ Reset Password ระบบก็จะให้ระบุอีเมลของสมาชิกท่านนั้น เพื่อส่งรหัสยืนยัน หรือ Token ไปยังอีเมล เพื่อให้สมาชิกนำ Token นั้นมาใส่ในช่อง Token ตามขั้นตอนที่ได้ระบุไว้ในอีเมลนั้น ๆ จึงจะสามารถ Reset Password และกำหนดรหัสผ่านใหม่ได้ , แต่ระหว่างขั้นตอนการใส่ Token นี้เองสิ่งที่ขาดหายไปคือ ช่องใส่ Username ครับ ทำให้เมื่อใส่ Token ทีไร ก็ไม่ผ่านซักที

Invalid Token

วิธีแก้ไขคือ ให้ทำการหาคอมโพเน้นท์ com_user ที่ได้ถูกเพิ่มเติมมากับเทมเพลตนั้นครับ โดยมักจะอยู่ที่ /templates/ชื่อเทมเพลต/html/com_user โดยให้เราหาไฟล์ confirm.php ที่ใช้สำหรับ Reset Password ครับ ซึ่งหากไม่มีอะไรพิศดารกว่านี้ มันก็จะอยู่ที่ /templates/ชื่อเทมเพลต/html/com_user/reset/confirm.php จากนั้นเปิดมันขึ้นมาครับ แล้วทำการค้นหาโค๊ดชุดนี้ก่อนครับ

 <div>
 <label for="token" class="hasTip" title="::">:</label>
 <input id="token" name="token" type="text" class="required" size="36" />
 </div>

โค๊ดด้านบน จะเป็นส่วนของช่องที่ให้สมาชิกระบุรหัสยืนยัน หรือ Token ครับ โดยเราจะต้องเพิ่มช่อง Username เข้าไปก่อนโค๊ดชุดด้านบน โดยการ Copy โค๊ดด้านล่างนี้ ไปวางก่อนโค๊ดชุดด้านบนครับ

 <div>
 <label for="username" class="hasTip" title="::">:</label>
 <input id="username" name="username" type="text" class="required" size="36" />
 </div>

จากนั้นก็บันทึกไฟล์ แล้วมาดูผลครับ

Invalid Token

ก็จะพบว่า มีช่องให้ใส่ Username เพิ่มขึ้นมาแล้ว ซึ่งถึงจุดนี้ เมื่อผู้ใช้งานต้องการกู้รหัสผ่านของตนเอง ก็จะต้องระบุทั้ง Username และ Token ให้ถูกต้อง เพียงเท่านี้ก็จะสามารถเข้าสู่ขั้นตอนการกำหนดรหัสผ่านใหม่ได้แล้วครับ โดยจะไม่มีการแจ้งเตือน Invalid Token อีกต่อไป

Invalid Token