web-dev-qa-db-fra.com

backbone.js - gestion si un utilisateur est connecté ou non

Premièrement, la page statique servie pour l'application doit-elle être la page de connexion?

Deuxièmement, mon code côté serveur est correct (il ne donnera aucune donnée que l'utilisateur ne devrait pas voir). Mais comment faire savoir à mon application que si l'utilisateur n'est pas connecté, pour revenir à un formulaire de connexion?

42
Matthew

J'ai un appel principal que mon code côté client que ma page statique (index.php) fait pour vérifier si l'utilisateur actuel est connecté. Disons que vous avez un appel principal à api/auth/logged_in qui renvoie le code d'état HTTP 200 si l'utilisateur est connecté ou 400 sinon (en utilisant des sessions basées sur les cookies):

appController.checkUser(function(isLoggedIn){
    if(!isLoggedIn) {
        window.location.hash = "login";    
    }

    Backbone.history.start();
});

...

window.AppController = Backbone.Controller.extend({

  checkUser: function(callback) {
     var that = this;

     $.ajax("api/auth/logged_in", {
       type: "GET",
       dataType: "json",
       success: function() {
         return callback(true);
       },
       error: function() {
         return callback(false);
       }
     });
  }
});
14
Sam

J'utilise le concept de session pour contrôler l'état de connexion de l'utilisateur.

J'ai un SessionModel et SessionCollection comme ceci:

SessionModel = Backbone.Model.extend({
    defaults: {
        sessionId: "",
        userName: "",
        password: "",
        userId: ""
    },

    isAuthorized: function(){
       return Boolean(this.get("sessionId"));
    }

});

Au démarrage de l'application, j'initialise une variable disponible à l'échelle mondiale, activeSession. Au début, cette session n'est pas autorisée et toutes les vues liées à cette instance de modèle peuvent être rendues en conséquence. Lors d'une tentative de connexion, je me déconnecte d'abord en invalidant la session.

logout = function(){
    window.activeSession.id = "";
    window.activeSession.clear();
}

Cela déclenchera toutes les vues qui écoutent la session active et mettra ma vue principale en mode de connexion où elle affichera une invite de connexion. J'obtiens alors le nom d'utilisateur et le mot de passe de l'utilisateur et les mets sur la session active comme ceci:

login = function(userName, password){
    window.activeSession.set(
        {
            userName: userName,
            password: password
        },{
            silent:true
        }
    );
    window.activeSession.save();
}

Cela déclenchera une mise à jour du serveur via backbone.sync. Sur le serveur, j'ai la ressource de session POST afin qu'elle vérifie le nom d'utilisateur et le mot de passe. Si elle est valide, elle remplit les détails de l'utilisateur sur la session, définit un identifiant de session unique et supprime le mot de passe puis renvoie le résultat.

Mon backbone.sync est ensuite configuré pour ajouter le sessionId de window.activeSession à toute demande sortante au serveur. Si l'ID de session n'est pas valide sur le serveur, il renvoie un HTTP 401, ce qui déclenche une déconnexion (), conduisant à l'affichage de l'invite de connexion.

Nous n'avons pas encore tout à fait mis en œuvre cela, donc il peut y avoir des erreurs dans la logique, mais en gros, c'est ainsi que nous l'abordons. En outre, le code ci-dessus n'est pas notre code réel, car il contient un peu plus de logique de manipulation, mais c'est l'essentiel.

70
Jens Alm
5
Tausif Khan

Je pense que vous devez non seulement contrôler l'affichage html mais également contrôler les données d'affichage. Parce que l'utilisateur peut utiliser Firefox pour changer votre code javascript.

Pour plus de détails, vous devez donner à l'utilisateur un jeton après sa connexion et chaque fois qu'il visite votre composant dans une page telle qu'une grille de données ou un arbre ou quelque chose comme ça, la page doit récupérer ces données (peut-être en json) à partir de votre service Web, et le webservice vérifiera ce jeton, si le jeton est incorrect ou dépassé, vous ne devriez pas donner de données utilisateur à la place, vous devriez donner un message d'erreur. Cet utilisateur ne peut donc pas casser votre sécurité même s'il utilise Firebug pour changer le code js.

Cela pourrait vous être utile.

2
Alex Yang