web-dev-qa-db-fra.com

Comment implémentez-vous l'authentification par jeton dans Flask?

J'essaie d'autoriser les utilisateurs à se connecter à mon Flask en utilisant leurs comptes à partir d'un service Web distinct. Je peux contacter l'API de ce service Web et recevoir un jeton de sécurité. Comment utiliser ce jeton pour authentifier les utilisateurs afin qu'ils aient accès à des vues restreintes?

Je n'ai pas besoin de sauvegarder les utilisateurs dans ma propre base de données. Je veux seulement les authentifier pour une session. Je crois que cela peut être fait en utilisant Flask-Security et le décorateur @auth_token_required mais la documentation n'est pas très détaillée et je ne sais pas comment l'implémenter.

ÉDITER:

Voici un exemple de code:

@main.route("/login", methods=["GET", "POST"])
def login():

    payload = {"User": "john", "Password": "password123"}
    url = "http://webserviceexample/api/login"
    headers = {'content-type': 'application/json'})

    #login to web service
    r = requests.post(url, headers=headers, json=payload)
    response = r.json()

    if (r.status_code is 200):
        token = response['user']['authentication_token']

        # allow user into protected view

    return render_template("login.html", form=form)


@main.route('/protected')
@auth_token_required
def protected():
    return render_template('protected.html')
12
Amerikaner

Salut Amedrikaner!

Il semble que votre cas d'utilisation soit suffisamment simple pour que nous puissions l'implémenter nous-mêmes. Dans le code ci-dessous, je stocke votre jeton dans la session des utilisateurs et j'archive un nouveau wrapper. Commençons par créer notre propre wrapper, je les mets généralement dans un fichier wrappers.py mais pouvez-vous le placer où vous le souhaitez.

def require_api_token(func):
    @wraps(func)
    def check_token(*args, **kwargs):
        # Check to see if it's in their session
        if 'api_session_token' not in session:
            # If it isn't return our access denied message (you can also return a redirect or render_template)
            return Response("Access denied")

        # Otherwise just send them where they wanted to go
        return func(*args, **kwargs)

    return check_token

Cool!

Maintenant que notre wrapper est implémenté, nous pouvons simplement enregistrer leur jeton dans la session. Super simple. Modifions votre fonction ...

@main.route("/login", methods=["GET", "POST"])
def login():

    payload = {"User": "john", "Password": "password123"}
    url = "http://webserviceexample/api/login"
    headers = {'content-type': 'application/json'})

    #login to web service
    r = requests.post(url, headers=headers, json=payload)
    response = r.json()

    if (r.status_code is 200):
        token = response['user']['authentication_token']

        # Move the import to the top of your file!
        from flask import session

        # Put it in the session
        session['api_session_token'] = token

        # allow user into protected view

    return render_template("login.html", form=form)

Vous pouvez maintenant vérifier les vues protégées en utilisant le wrapper @require_api_token, comme ceci ...

@main.route('/super_secret')
@require_api_token
def super_secret():
    return "Sssshhh, this is a secret"

MODIFIER Woah! J'ai oublié de mentionner que vous devez définir votre SECRET_KEY dans la configuration de vos applications.

Juste un fichier config.py avec SECRET_KEY = "SOME_RANDOM_STRING" fera l'affaire. Ensuite, chargez-le avec ...

main.config.from_object(config)
18
F Boucaut