Sobes.tech
Junior

Περιγράψτε τη μηχανική της διαδικασίας σύνδεσης του χρήστη στο σύστημα.

sobes.tech AI

Απάντηση από AI

  1. Ο χρήστης εισάγει τα διαπιστευτήριά του (όνομα χρήστη και κωδικό πρόσβασης) στη σελίδα σύνδεσης.
  2. Ο περιηγητής στέλνει ένα αίτημα HTTP POST στον διακομιστή με τα εισαγόμενα δεδομένα.
  3. Ο διακομιστής λαμβάνει το αίτημα και μεταβιβάζει τα διαπιστευτήρια στο συστατικό πιστοποίησης.
  4. Το συστατικό πιστοποίησης επαληθεύει τα ληφθέντα δεδομένα με τις πληροφορίες στη βάση δεδομένων χρηστών:
    • Ελέγχει αν υπάρχει χρήστης με αυτό το όνομα χρήστη.
    • Κρυπτογραφεί τον εισαγόμενο κωδικό πρόσβασης και τον συγκρίνει με το hash του κωδικού που αποθηκεύεται για αυτόν τον χρήστη.
  5. Σε περίπτωση επιτυχούς πιστοποίησης:
    • Ο διακομιστής δημιουργεί μια συνεδρία για τον χρήστη ή παράγει ένα διακριτικό πρόσβασης (π.χ. JWT).
    • Η συνεδρία/το διακριτικό συσχετίζεται με έναν μοναδικό αναγνωριστικό χρήστη και περιέχει πληροφορίες σχετικά με τα δικαιώματά του.
    • Ο διακομιστής στέλνει μια απάντηση HTTP με κωδικό 200 OK και μεταδίδει τη συνεδρία (μέσω cookie) ή το διακριτικό πρόσβασης στον περιηγητή του χρήστη.
    • Ο περιηγητής αποθηκεύει το cookie ή το διακριτικό.
    • Ο χρήστης ανακατευθύνεται στη βασική σελίδα ή στη σελίδα προορισμού.
  6. Σε περίπτωση αποτυχίας πιστοποίησης (λάθος όνομα χρήστη ή κωδικός):
    • Ο διακομιστής στέλνει μια απάντηση HTTP με κωδικό σφάλματος (π.χ. 401 Unauthorized) και μήνυμα σφάλματος.
    • Ο περιηγητής εμφανίζει ένα μήνυμα σφάλματος στον χρήστη στη σελίδα σύνδεσης.
  7. Σε επόμενα αιτήματα σε προστατευμένους πόρους, ο περιηγητής στέλνει αυτόματα τη διατηρημένη συνεδρία (cookie) ή το διακριτικό πρόσβασης στα κεφαλίδια του HTTP αιτήματος.
  8. Ο διακομιστής ελέγχει την εγκυρότητα της συνεδρίας/διακριτικού και επιτρέπει την πρόσβαση στον πόρο εάν η πιστοποίηση έχει επιβεβαιωθεί και ο χρήστης έχει τα απαραίτητα δικαιώματα.

Παράδειγμα (ψευδοκώδικας):

# Στον διακομιστή
def login(username, password):
    user = database.find_user(username)
    if user and hash(password) == user.hashed_password:
        session_id = generate_session_id(user.id)
        database.save_session(session_id, user.id)
        return {"status": "success", "session_id": session_id}
    else:
        return {"status": "fail", "message": "Μη έγκυρα διαπιστευτήρια"}

# Στον πελάτη (στον περιηγητή)
async function handle_login_submit(event):
    event.preventDefault();
    const username = document.getElementById("username").value;
    const password = document.getElementById("password").value;

    const response = await fetch("/api/login", {
        method: "POST",
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify({ username, password })
    });

    const data = await response.json();
    if (data.status === "success") {
        // Ο διακομιστής θα ορίσει ένα cookie με το session_id, ή μπορούμε να αποθηκεύσουμε το token από την απάντηση
        window.location.href = "/dashboard";
    } else {
        alert(data.message);
    }