Junior
Περιγράψτε τη μηχανική της διαδικασίας σύνδεσης του χρήστη στο σύστημα.
sobes.tech AI
Απάντηση από AI
- Ο χρήστης εισάγει τα διαπιστευτήριά του (όνομα χρήστη και κωδικό πρόσβασης) στη σελίδα σύνδεσης.
- Ο περιηγητής στέλνει ένα αίτημα HTTP POST στον διακομιστή με τα εισαγόμενα δεδομένα.
- Ο διακομιστής λαμβάνει το αίτημα και μεταβιβάζει τα διαπιστευτήρια στο συστατικό πιστοποίησης.
- Το συστατικό πιστοποίησης επαληθεύει τα ληφθέντα δεδομένα με τις πληροφορίες στη βάση δεδομένων χρηστών:
- Ελέγχει αν υπάρχει χρήστης με αυτό το όνομα χρήστη.
- Κρυπτογραφεί τον εισαγόμενο κωδικό πρόσβασης και τον συγκρίνει με το hash του κωδικού που αποθηκεύεται για αυτόν τον χρήστη.
- Σε περίπτωση επιτυχούς πιστοποίησης:
- Ο διακομιστής δημιουργεί μια συνεδρία για τον χρήστη ή παράγει ένα διακριτικό πρόσβασης (π.χ. JWT).
- Η συνεδρία/το διακριτικό συσχετίζεται με έναν μοναδικό αναγνωριστικό χρήστη και περιέχει πληροφορίες σχετικά με τα δικαιώματά του.
- Ο διακομιστής στέλνει μια απάντηση HTTP με κωδικό 200 OK και μεταδίδει τη συνεδρία (μέσω cookie) ή το διακριτικό πρόσβασης στον περιηγητή του χρήστη.
- Ο περιηγητής αποθηκεύει το cookie ή το διακριτικό.
- Ο χρήστης ανακατευθύνεται στη βασική σελίδα ή στη σελίδα προορισμού.
- Σε περίπτωση αποτυχίας πιστοποίησης (λάθος όνομα χρήστη ή κωδικός):
- Ο διακομιστής στέλνει μια απάντηση HTTP με κωδικό σφάλματος (π.χ. 401 Unauthorized) και μήνυμα σφάλματος.
- Ο περιηγητής εμφανίζει ένα μήνυμα σφάλματος στον χρήστη στη σελίδα σύνδεσης.
- Σε επόμενα αιτήματα σε προστατευμένους πόρους, ο περιηγητής στέλνει αυτόματα τη διατηρημένη συνεδρία (cookie) ή το διακριτικό πρόσβασης στα κεφαλίδια του HTTP αιτήματος.
- Ο διακομιστής ελέγχει την εγκυρότητα της συνεδρίας/διακριτικού και επιτρέπει την πρόσβαση στον πόρο εάν η πιστοποίηση έχει επιβεβαιωθεί και ο χρήστης έχει τα απαραίτητα δικαιώματα.
Παράδειγμα (ψευδοκώδικας):
# Στον διακομιστή
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);
}