Come usare un token a tempo per resettare la password in python

come usare un token a tempo per resettare la password in python

in questa mia prima esperienza ho usato la classe TimedJSONWebSignatureSerializer sulla versione 3.8

Estrapolerò solo la parte di codice che ha interessato il mio progetto, dove un impiegato della società poteva risettare la sua password.

Per prima cosa ho inserito in una classe le funzioni necessarie

  • get_reset_token   per la generazione del token da inviare alla emai. Nel mio caso per comodità ho inserito nella criptazione anche lo user_id dell'utente che fa richiesta. Mi servirà nella modifica effettiva. Come si vede dalla dichiarazione della funzione, la durata di validità è un parametro che si può settare a piacimento

  • verify_reset_token per la verifica del token stesso quando viene cliccato il link

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer


class User(db.Model, UserMixin):
def get_reset_token(self, expire_sec=1800):
s = Serializer(current_app.config['SECRET_KEY'], expire_sec)
return s.dumps({'user_id' : self.id}).decode('utf-8')

@staticmethod
def verify_reset_token(token):
s = Serializer(current_app.config['SECRET_KEY'])
try:
user_id = s.loads(token)['user_id']
except:
return None
return User.query.get(user_id)

adesso passo alle regole di routing

  • users.route("/reset_password", methods=['GET', 'POST']) che genera il token e lo spedisce via email

  • @users.route("/reset_password/", methods=['GET', 'POST']) verifica e criptazione del token per poi procedere al recupero delle informazioni necessarie

  • per concludere una semplice funzione di invio email usando la classe Message

Maybe you might be interested

come aumentare un contatore in pyhon in un template jinja
come aumentare un contatore in pyhon in un template jinja

il codice seguente è stato scritto e testato nella versione 3.9 e utilizzando il namespace

from myProject import mail
from flask_mail import Message

users.route("/reset_password", methods=['GET', 'POST'])
def reset_request():
if current_user.is_authenticated:
return redirect(url_for('main.homepage'))
form = RequestResetForm()
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
send_reset_email(user)
flash('email spedita con le credenziali', 'info')
return redirect(url_for('users.login'))
return render_template("reset_request.html", title = 'Richiesta reset password', form=form)


@users.route("/reset_password/", methods=['GET', 'POST'])
def reset_token(token):
if current_user.is_authenticated:
return redirect(url_for('main.homepage'))
user = User.verify_reset_token(token)
if user is None:
flash('invalid token', 'warning')
return redirect(url_for('users.reset_request'))

form = ResetPasswordForm()
if form.validate_on_submit():
hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
user.password = hashed_password
db.session.commit()
flash("Password modificata", 'success')
return redirect(url_for('users.login'))

return render_template("reset_token.html", title = 'Richiesta reset password', form=form)

Maybe you might be interested

validazione nell’utilizzo del modulo croniter di python
validazione nell’utilizzo del modulo croniter di python

la chiamata is_valid applicata al monitoraggio dei crontab

test audiometrico in python
test audiometrico in python

quando studi il "bip" e pensi: "a che minchia può servirmi" e poi l'illuminazione

utilizzare strpos e substr in un template con smarty

Begin, editor VI di linux. Che emozione

Come l’intelligenza artificiale può arrivare a discriminare per etnia

Verificare che un anagramma di una stringa sia contenuto in un’altra stringa in PHP