Solución:
La mejor forma de hacerlo es utilizar itsdangerous
paquete. Puede generar una URL que dure el tiempo que desee. Además, puede codificar secretamente cualquier información dentro de la URL. Lo bueno de eso es que NO es necesario tratar o almacenar marcas de tiempo en la base de datos
Para generar una URL que dure 30 minutos y codificar la identificación del usuario dentro del token
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
s = Serializer('WEBSITE_SECRET_KEY', 60*30) # 60 secs by 30 mins
token = s.dumps({'user_id': currentuser.id}).decode('utf-8') # encode user id
Utilice lo siguiente para generar la URL que desee
url_for('get_file', token=token)
Para validar una URL
@app.route('/get_file/<token>')
def get_file(token):
s = Serializer('WEBSITE_SECRET_KEY')
try:
user_id = s.loads(token)['user_id']
except:
return None
user = User.query.get(user_id)
if not user:
flash('This is an invalid or expired URL, please generate a new one!', 'warning')
return redirect(url_for('another_route'))
return send_from_directory('static', filename, as_attachment=True)
Hay un par de formas de hacerlo.
-
Genere un UUID para su token y guárdelo en una tabla de base de datos junto con la fecha de vencimiento deseada. Luego, cuando alguien llama a la URL con el token, puede compararla con la base de datos para verificar su validez y vencimiento.
-
Si no desea usar una base de datos para almacenar los tokens, puede usar GPG para encriptar una cadena que contiene la fecha y hora de vencimiento y usar la cadena encriptada resultante como su token. Esto significa que su token será mucho más largo que un UUID, pero evitaría tener que usar un db.
Recomiendo usar UUID y una tabla db.
Quizás deberías usar hmac.
Generar enlace
import hashlib
import hmac
import time
secret = "anything you like" # such as generate from os.urandom(length)
def generate(filename):
current_time = str(int(time.time()))
token = hmac.new(secret, current_time, hashlib.sha256).hexdigest()
return "get_file?file=%(filename)s&time=%(current_time)s&token=%(token)s" % {
"filename": filename,
"current_time": current_time,
"token": token
}
Verificar enlace
import hashlib
import hmac
import time
secret = "anything you like" # same as in generate function
def verify(time_in_link, token_in_link):
time_limit = 15 * 60 # maximum time in sec(such as: 15(mins) * 60 (convert them to sec)`enter code here`) that you want them to start download after the link has been generated.
if (time.time() - int(time_in_link)) > time_limit: #timeout, return False
return False
if hmac.new(secret, str(time_in_link), hashlib.sha256).hexdigest() == token_in_link: # Check the token is available or not
return True
else:
return False