Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso de Flask

Curso de Flask

Bernardo Cassina

Bernardo Cassina

Signup

31/36
Recursos

Aportes 16

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Si después de hashear el pwd ya no pueden entrar con su usuario, tienen que usar un check_password_hash en el metodo del login

@auth.route('/login', methods=['GET', 'POST'])
def login():
    login_form = LoginForm()
    context = {
        'login_form': LoginForm()
    }

    if login_form.validate_on_submit():
        username = login_form.username.data
        password = login_form.password.data
        user_doc = get_user(username)

        if user_doc.to_dict() is not None:
            
            if check_password_hash(user_doc.to_dict()['password'], password):
                user_data = UserData(username,password)
                user = UserModel(user_data)

                login_user(user)
                flash('Well come again')
                redirect(url_for('hello'))
            else:
                flash('wrong password >:(')
        else:
            flash('user does not exist =/')
        return redirect(url_for('index'))
    
    return render_template('login.html', **context)

Hola Comunidad!

Averiguando encontré que current_user tbm tiene la propiedad is_anonymous

por lo que hice que el link de signup aparezca en el navbar solo si el usuario no está logeado

navbar.html

{% if current_user.is_anonymous %}
        <li><a href="{{ url_for('auth.signup') }}">Signup</a></li>
{% endif %}

Despues de incluir la función generate_password_hash, debemos modificar la función login incluyendo otra función llamada check_password_hash para poder validar correctamente la contraseña que el usuario introduce y permitirle el login, en caso contrario la app no permitira al usuario el acceso a pesar que la contraseña sea correcta, ambas funciones las importamos desde werkzeug.security

Test para nuestro feature de Sign up:


    def test_auth_signup_get(self):
        response = self.client.get(url_for('auth.signup'))

        self.assert200(response)
    

   def test_auth_signup_post(self):
        try:
            fake_form = {
                'username': 'test_user',
                'password': '123456'
            }
            response = self.client.post(url_for('auth.signup'), data=fake_form)
            self.assertRedirects(response, url_for('hello'))
        finally:
            #Remove added db
            db_service._delete_user(fake_form['username'], caller=self)
            

Como la funcionalidad efectivamente crea un usuario en la base de datos, hay que borrarlo para repetir los tests en el futuro!

Seria muy util que trabajaras un ejemplo con una base datos tradicional MySQL o Postgresql

Para mostrar en menú “Logout” solo si está en sesión
Para mostrar en menú “Signup” solo si no está en sesión

<ul class="nav navbar-nav">
        <li><a href="{{ url_for('index') }}">Inicio</a></li>
	<li><a href="{{ url_for('auth.login') }}">Ingresar</a></li>
	{% if username %}
		<li><a href="{{ url_for('auth.logout') }}">Logout</a></li>
	{% else %}
		<li><a href="{{ url_for('auth.signup') }}">Signup</a></li>
	{% endif %}
	<li><a href="https://platzi.com" target="_blank">Platzi</a></li>
</ul>

Si no entendiste bien como funciona el metodo put aqui la descripcion

def user_put(user_data):
    # Creamos la referencia para coleccion users
    # crea una referenca al id del documento en users
    user_ref = db.collection('users').document(user_data.username)
    # Escribe el documento son el keyword set en firestore, 
    # la data como parametro crea una coleccion dentro  
    user_ref.set({'password': user_data.password})

Esta es la creacion de un usuario de forma programatica, y equivalente de esto

Asi va

Hola comunidad, he estado intentando realizar el ejercicios pero con SQLAlchemy, no ha sido fácil pero voy poco a poco… a la fecha he podido realizar tanto el login como el signup, reviso la base de datos y los mensajes que envío por consola y todo va bien, sin embargo ya sea al realizar el login o el signup y pasar por el filtro @Login_manager.user_loader() el username viene vacío, esto ocasioná que al realizar la consulta en el UserModel nunca encuentre al usuario y por lo tanto no termina el proceso.

@login_manager.user_loader
def load_user(username):
print(“entramos a load user”, username
return UserModel.query(username)

en el ejemplo del profe no veo en ningún momento que se le este pasando el valor de username para que lo compruebe el load_user, alguien me puede explicar el funcionamiento interno de load_user y cómo este recibe el valor del parámetro…?

He intentando pasar el username como parámetro en el redirect pero me envía un error

return redirect(url_for('hello'), username=user_data.username)

TypeError
TypeError: redirect() got an unexpected keyword argument ‘username’

Help me…

no se si alguien realizó o esta realizando el ejercicio en sqlAlchemy y lo puede mostrar en Github

Excelente curso Bernardo.
Una pregunta como le haces para recuperar el password y desencriptarlo al hacer logon?
Agradecido

Creo que una de las frases más importantes del curso es “Nadie debe de conocer el password de los usuarios mas que los usuarios” sobre todo con los leaks que se pueden llegar a dar de las bases de datos. Un claro ejemplo de esto es la página haveibeenpwned donde puedes ver si tu contraseña ha sido robada de algún sitio web.

Para tener un mejor formulario en SignUp:

# Un intento para hacer un formulario de registro :D
class SignUp(FlaskForm):
    username = StringField('Nombre de Usuario',validators=[DataRequired()])
    password = PasswordField('Password',validators=[DataRequired(), InputRequired(),EqualTo('password')])
    password_repeat = PasswordField('Repite tu Password',validators=[DataRequired(),InputRequired()])
    submit = SubmitField('Enviar')

el siguinete enlace te ayudará entender a más profundidad del tema

https://developer.okta.com/blog/2018/07/12/flask-tutorial-simple-user-registration-and-login

Esta clase me parecio interesante, aqui un poco mas de informacion acerca de Werkzeug.security:

Si quieres probar con la primer cuenta y te regresa el error de que no es la contraseña, recuerda que cambiamos el chequeo con un hash. En sí, no estás comparando “holahola” con “holahola” sino un hasheo_de_holahola con “holahola”