Partage
  • Partager sur Facebook
  • Partager sur Twitter

Flask oauth: logout impossible avec gitlab as oaut

Flask oauth: logout impossible avec gitlab comme oauth provider

    18 décembre 2023 à 9:57:21

    Bonjour à tous,
    J'utilise gitlab comme fournisseur oauth dans une application flask.
    J'utilise flask_oauthlib et flask_login. 
    Ma fonction de déconnexion fonctionne mais je suis ensuite automatiquement reconnecté à nouveau, même avec un navigateur privé.
    Voici mon code:
    @login_manager.user_loader
    def load_user(user_id):
        if "gitlab_token" in session:
            user_info = gitlab.get("user")
            return User(user_id, session["gitlab_token"][0], user_info.data["name"])
        return None
    
    
    @login_manager.unauthorized_handler
    def unauthorized():
        return redirect(url_for("login"))
    
    
    @gitlab.tokengetter
    def get_token():
        return session.get("gitlab_token")
    
    
    @app.route("/")
    @login_required
    def index():
        return render_template("index.html", navitems=navitems)
    
    
    @app.route("/login")
    def login():
        callback_url = url_for("authorized", _external=True)
        return gitlab.authorize(callback=callback_url)
    
    
    @app.route('/logout', methods=['POST'])
    @login_required
    def logout():
        logout_user()
        session.pop('gitlab_token', None)
        session.clear()
        #revoke_gitlab_token(session.get('gitlab_token'))
        return redirect(url_for('index'))
    
    
    @app.route("/login/authorized")
    def authorized():
        response = gitlab.authorized_response()
        if response is None or response.get("access_token") is None:
            LOG.error("OAuth authorization failed: %s", response)
            return "Access denied: reason={} error={}".format(
                request.args["error_reason"], request.args["error_description"]
            )
        session["gitlab_token"] = (response["access_token"], "")
        user_info = gitlab.get("user")
        user = User(
            user_info.data["username"], response["access_token"], user_info.data["name"]
        )
        login_user(user)
        return redirect(url_for("index"))
    Quelqu'un aurait-il déja rencontré ce problème? Je peux partager plus de code si besoin.
    Merci beaucoup,
    Thibault
    • Partager sur Facebook
    • Partager sur Twitter
      19 décembre 2023 à 18:31:51

      Ce ne serait à cause du décorateur @login_required en ligne 20 ?
      • Partager sur Facebook
      • Partager sur Twitter
        20 décembre 2023 à 11:35:27

        Bonjour, merci pour votre réponse. Le problème est que sans ce décorateur sur l'index, il est possible d'y acceder sans passer par la page de connexion et donc d'être authentifier par oauth via gitlab.
        • Partager sur Facebook
        • Partager sur Twitter
          20 décembre 2023 à 12:16:00

          Quand tu te déconnectes, tu vas bien sur la page index ?
          • Partager sur Facebook
          • Partager sur Twitter
            22 décembre 2023 à 9:32:41

            Oui effectivement je veux bien aller sur la page index, mais je veux qu'on passe par la phase d'authentification (ce qui est logique après un logout), alors que pour le moment je suis reconnecté automatiquement
            • Partager sur Facebook
            • Partager sur Twitter
              22 décembre 2023 à 10:51:58

              De ce que je lis, le décorateur @login_required fait que si l'utilisateur n'est pas loggé, il est redirigé vers une autre adresse définie par settings.LOGIN_URL; est-ce que tu as défini une valeur pour ce paramètre ?

              https://docs.djangoproject.com/fr/4.2/topics/auth/default/#the-login-required-decorator 

              • Partager sur Facebook
              • Partager sur Twitter
                22 décembre 2023 à 11:52:55

                Jene suis pas sur une application django mais flask. Le comportement que je souhaite est par exemple décrit ici dans la dernière partie juste avant la conclusion:

                https://www.digitalocean.com/community/tutorials/how-to-add-authentication-to-your-app-with-flask-login#step-9-adding-the-login-method

                "Use the @login_required decorator because it does not make sense to log out a user that is not logged in to begin with.

                After a user logs out and tries to view the profile page again, they will be presented with an error message:"

                Et là ils retombent eux sur la page où l'on doit rentrer ses identifiants. Moi dans mon cas, après un logout, je suis bien déconnecté mais tout de suite je suis à nouveau connecté (et donc j'arrive sur la page index). C'est comme si le navigateur considérait que j'étais déja connecté. Pourtant ça me le fait quand même en navigateur privé, ainsi qu'en désactivant tout les cookies.

                • Partager sur Facebook
                • Partager sur Twitter

                Flask oauth: logout impossible avec gitlab as oaut

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                • Editeur
                • Markdown