Sobes.tech
Junior

Descreva a mecânica do processo de login do usuário no sistema.

sobes.tech IA

Resposta da IA

  1. O utilizador insere os seus dados de login (nome de utilizador e palavra-passe) na página de login.
  2. O navegador envia uma requisição HTTP POST ao servidor com os dados inseridos.
  3. O servidor recebe a requisição e passa os dados de login para o componente de autenticação.
  4. O componente de autenticação verifica os dados recebidos com as informações na base de dados de utilizadores:
    • Verifica se existe um utilizador com esse nome de utilizador.
    • Hashea a palavra-passe inserida e compara com o hash da palavra-passe armazenada para esse utilizador.
  5. Em caso de autenticação bem-sucedida:
    • O servidor cria uma sessão para o utilizador ou gera um token de acesso (por exemplo, JWT).
    • A sessão/o token é associada a um identificador único do utilizador e contém informações sobre os seus direitos de acesso.
    • O servidor envia uma resposta HTTP com o código 200 OK e transmite a sessão (através de cookie) ou o token de acesso ao navegador do utilizador.
    • O navegador guarda o cookie ou o token.
    • O utilizador é redirecionado para a página principal ou para a página alvo.
  6. Em caso de falha na autenticação (nome de utilizador ou palavra-passe incorretos):
    • O servidor envia uma resposta HTTP com um código de erro (por exemplo, 401 Unauthorized) e uma mensagem de erro.
    • O navegador exibe uma mensagem de erro ao utilizador na página de login.
  7. Em requisições subsequentes a recursos protegidos, o navegador envia automaticamente a sessão guardada (cookie) ou o token de acesso nos cabeçalhos da requisição HTTP.
  8. O servidor verifica a validade da sessão/do token e permite o acesso ao recurso se a autenticação for confirmada e o utilizador tiver os direitos necessários.

Exemplo (pseudo-código):

# No servidor
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": "Credenciais inválidas"}

# No cliente (no navegador)
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") {
        // O servidor irá estabelecer um cookie com session_id, ou podemos guardar o token da resposta
        window.location.href = "/dashboard";
    } else {
        alert(data.message);
    }