Saltar al contenido

¿Cómo proporcionar una URL de descarga temporal en Flask?

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.

  1. 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.

  2. 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
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *