Ký sự fix lỗi bí ẩn của Google và Facebook Authentication trên DayNhauHoc
Xin chào các bạn, mình là Đạt , hôm nay mình sẽ làm video hướng dẫn , à mà thôi …
Thời gian qua Đạt bận công việc nên bỏ bê chém gió diễn đàn. Hôm nay cuối tuần, vừa kết thúc 3 tháng gian truân học và làm Back End Web Developer. Đạt chuyển từ Embedded sang Back End Web Developer, sẽ viết một bài khác nói về lý do và so sánh sự khác biệt trong phong cách lập trình của hai món này sau.
Thôi, đi vào trọng tâm của vấn đề ngày hôm nay mà Đạt muốn chia sẻ đó là Đạt vừa mới fix một lỗi khá ngớ ngẩn của DayNhauHoc. Trước đây, diễn đàn có thể đăng ký và đăng nhập từ Facebook hoặc từ Google. Thế nhưng tầm 3-4 tháng gần đây thì tính năng đăng nhập bằng FB và Google hoạt động tốt còn đăng ký mới từ FB/Google thì tịt. Đạt chỉ biết tầm 1-2 tuần gần đây thôi.
Đạt cũng dành một hai buổi ra ngồi debug để tìm hiểu xem settings Google App và Facebook App xem có bị gì không. Tuy nhiên, lúc đó là trong tuần nên Đạt cũng bận không tìm hiểu kỹ. Chỉ thấy mọi settings đều ổn, account nào đã từng đăng ký bằng FB và Google thì có thể đăng nhập lại bình thường. Còn account nào mới thì thua, không thể đăng ký được. Khi đăng ký thì server báo lỗi 500, internal error.
Nói đơn giản thì quá trình tạo lỗi khá rõ ràng như sau:
- User vào diễn đàn bấm vào nút đăng ký -> request chuyển hướng qua FB/Google -> quay trở lại DayNhauHoc và dính lỗi 500
Lúc đó mình nghĩ, ủa, đăng ký bằng Google và FB thì liên quan gì tới internal error nhỉ? Lạ, thế là mình vào kiểm tra log của server thì phát hiện ra dòng này mỗi khi mình đăng ký thất bại
hmm, sao lại là hàm xxx_username
gì đó bị lỗi nhỉ? Tại sao đăng nhập thì không bị mà đăng ký lại bị? À, hóa ra là diễn đàn mình có một tính năng khá hay đó là tự động bỏ đi dấu tiếng Việt trong tên đăng ký.
Tức là nếu tên của mình là Lê Trần Đạt thì account sẽ được hiển thị thành Le_Tran_Dat. Đây là một tính năng custom lại của DayNhauHoc. Và đây cũng là nguồn cơn xảy ra cái lỗi ngớ ngẩn này.
Đây là đoạn code bị lỗi, lỗi ngay cái chỗ string.tr
def self.sanitize_username(name)
# For Vietnamese slug
# Convert Đ and đ to D and d (U+0111 and U+0110 to U+0064 and U+0044)
# NFKD doesn't work with them :(
string = string.tr('Đđ', 'Dd')
# NFKD normalization converts all chars to Combining unicode type
# All diacritical marks (dau thanh) are in this range, x00-x7F
string = UnicodeUtils.nfkd(string).gsub(/[^x00-x7F]/,').to_s
Trong cái hàm củ chuối này không có cái biến nào tên là string
cả :’(
Đoạn code này chưa bao giờ được test, đó là nguyên nhân làm cả mấy tháng nay diễn đàn không có ai đăng ký mới bằng FB hay Google được.
Vậy bây giờ mình có thể thấy được cái flow lúc nãy dẫn đến lỗi 500 như sau
- User vào diễn đàn bấm vào nút đăng ký -> request chuyển hướng qua FB/Google -> quay trở lại DayNhauHoc và diễn đàn phân tích tên người và biến đổi thành tên account từ “Lê Trần Đạt” thành “Le Tran Dat”, hàm này code củ chuối và dính lỗi 500.
Thế là dẫn đến việc đăng ký thì tèo còn đăng nhập, không phải thông qua bước này nữa, thì phi vèo vèo.
Lỗi thì nhỏ, mà tầm ảnh hưởng thì to, còn lý do thì củ chuối, Đạt xin kết thúc tại đây và sẵn thông báo cho mọi người là tính năng đăng ký bằng FB/Google hoạt động lại bình thường.
Chúc các bạn chém gió vui vẻ
Cái chữ Đ đó hình như regex ngôn ngữ nào cũng bị dính chưởng
May mà anh tên là Đạt. Tên Phong hay gì là khỏi debug ra rồi
Mừng anh trở lại Mà tại sao anh chuyển sang web vậy ạ