• בלוג
  • מנגנון האותנטיקציה של ריילס 8 דווקא ממש נחמד

מנגנון האותנטיקציה של ריילס 8 דווקא ממש נחמד

05/10/2024

הג'ם הכי וותיק שאני זוכר בריילס נקרא Devise. לקראת הפוסט בדקתי כדי לוודא תאריכים והוא החל את דרכו ב 2009 ומאז מתקדם עם ריילס ומספק את הדרך הכי סטנדרטית שיש מחוץ לפריימוורק לניהול משתמשים. וכמו הרבה ספריות אחרות שפותרות בעיות גדולות, גם דיבייז יכול להיות מסובך וכולל חלקים נסתרים ולא מעט קסם. דברים פשוטים באמת אפשר לכתוב כמעט בלי קוד, אבל ככל שה Use Case נהיה יותר מורכב כך צריך יותר להתאמץ כדי להיכנס לקרביים ולשנות התנהגויות.

ועדיין ניהול משתמשים זו משימה מורכבת ולכן הגעתי ברגשות מעורבים לבדוק את מנגנון ניהול המשתמשים המובנה של Rails 8. בניגוד לדיבייז, הצוות של ריילס לקחת החלטה לשים את כל הקוד בצורה גלויה ולהפעיל אותו דרך Generator (בדומה לפיניקס. אולי משם הגיעה ההשראה). אחרי הפעלת ה Generator אנחנו מקבלים שתי טבלאות חדשות, יחד עם המודלים שמתאימים להן וכמה מסכים:

  1. טבלת משתמשים (users), יחד עם מודל בשם User שמנהל מידע על משתמש. הקוד שנוצר מזהה משתמש לפי כתובת אימייל וסיסמה, וכמובן שהסיסמה נשמרת אחרי bcrypt.

  2. טבלת sessions, יחד עם מודל בשם Session שמנהלת את החיבורים של משתמשים למערכת. פה יש גם מסך התחברות וקוד לניתוק.

  3. קונטרולר ומסכים לטיפול ב"שכחתי סיסמה".

ברירות המחדל שנבחרו מצוינות:

באופן אוטומטי כל המסכים שניצור ביישום ידרשו אותנטיקציה, אלא אם כן נציין אחרת במפורש בזכות הקוד:

class ApplicationController < ActionController::Base
  include Authentication
  # Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has.
  allow_browser versions: :modern
end

השורה include Authentication מכניסה לכל קונטרולר את הבלוק:

included do
  before_action :require_authentication
  helper_method :authenticated?
end

הסיסמאות שמורות בתור bcrypt.

מסך החיבור מוגבל עם Rate Limit עם השורה:

  rate_limit to: 10, within: 3.minutes, only: :create, with: -> { redirect_to new_session_url, alert: "Try again later." }

למרות כל היתרונות יש עדיין לא מעט דברים חסרים שיהיה עלינו לממש לבד, לדוגמה:

  1. אין תמיכה בייצור טוקנים ל API.

  2. אין מסכים ליצירת משתמשים, או בכלל התיחסות ל flow של משתמש חדש (אולי אימות של כתובת מייל).

  3. אין עריכת פרטי משתמש, שינוי כתובת מייל או שינוי סיסמה.

  4. אין התיחסות לחיבור משתמש דרך שירותי צד שלישי.

סך הכל הבחירה להוסיף Generator לאותנטיקציה נראית בעיקר סמלית. המפתחים של ריילס מאותתים לנו שאפשר לייצר קוד התחברות לבד, שלא חייבים לסמוך על דיבייז בכל דבר ושהתוצאה אפילו עשויה להיות יותר טובה. כרגע מפתחים שירצו ללכת בדרך הזאת עדיין יצטרכו להוסיף לא מעט בעצמם, אבל אולי זה גם נחמד לקבל יותר שליטה על חלקים כל כך בסיסיים במערכת.