2
respostas

Erro de lógica na autenticação

Quando se tenta logar com um usuário que não existe, a lógica proposta não funciona:

form = FormularioUsuario(request.form)
usuario = Usuarios.query.filter_by(nickname=form.nickname.data).first()
senha = check_password_hash(usuario.senha, form.senha.data)
if usuario and senha:
    session['usuario_logado'] = usuario.nickname
    ... (continua)

Veja que, se o usuario não existir, a linha do check_password_hash não vai funcionar porque não existe usuario.senha

Alterei para fazer o seguinte:

form = FormularioUsuario(request.form)
usuario = Usuarios.query.filter_by(nickname=form.nickname.data).first()
if usuario:
    senha = check_password_hash(usuario.senha, form.senha.data)
    if senha:
        session['usuario_logado'] = usuario.nickname
        ... (continua)

Espero ter contribuido.

2 respostas

Olá, Ramon!

Obrigado por compartilhar sua dúvida sobre a lógica de autenticação no Flask. Realmente, a linha do check_password_hash pode causar um erro se o usuário não existir. Sua alteração foi correta, ao verificar primeiro se o usuário existe antes de fazer a comparação da senha.

A criptografia das senhas é uma medida importante para aumentar a segurança da aplicação. No contexto da aula, foi utilizado o Flask Bcrypt para gerar o hash das senhas. Essa extensão do Flask permite que você crie um hash a partir da senha fornecida pelo usuário e armazene apenas o hash no banco de dados.

Para verificar se a senha fornecida pelo usuário está correta, você utiliza a função check_password_hash, que compara o hash armazenado no banco de dados com a senha fornecida no formulário. Caso a comparação seja verdadeira, ou seja, as senhas coincidam, você pode autenticar o usuário.

É importante ressaltar que a criptografia das senhas é apenas uma camada de segurança adicional. É fundamental adotar outras práticas de segurança, como proteção contra ataques de força bruta, uso de tokens CSRF e validação dos dados fornecidos pelo usuário.

Bons estudos!

Fiz uma alteração quando vi que dava problema

@app.route('/autenticar', methods=['POST',])

def autenticar():

usuario = Usuarios.query.filter_by(nickname=request.form['usuario']).first()

if usuario:

    if request.form['senha'] == usuario.senha:
    
        session['usuario_logado'] = usuario.nickname
        
        flash(usuario.nickname + ' logado com sucesso!')
        
        proxima_pagina = request.form['proxima']
        
        if proxima_pagina != 'None':
        
            return redirect(proxima_pagina)
            
        else:
        
            return redirect('/')
            
    else:
    
        flash("Usuário ou senha não reconhecidos!")
        
        return redirect(url_for('login'))
        
else:

    flash("Usuário ou senha não reconhecidos!")
    
    return redirect(url_for('login'))