57 votes

Comment réaliser un système d'authentification Safe (!) Dans une application angularjs?

Je suis nouveau avec angularjs...

J'ai lu les docs, et terminé le tutoriel, mais j'ai aussi essayé autre chose par moi-même, et les choses commencent à faire sens pour moi.

Maintenant je me demande comment faire un coffre-fort système d'authentification.

La partie la plus facile: pas de code, je vais décrire les opérations de mon code à exécuter:

J'ai une forme classique: le nom d'utilisateur et le mot de passe de saisie de texte.

L'utilisateur remplit le formulaire et appuyez sur ENTRÉE.

Une requête ajax commence, et la réponse est un JSON me disant quelque chose comme "ok, je sais que vous" ou "je ne sais pas qui vous êtes".

Ce que j'ai besoin maintenant, c'est à mantain connecté statut du visiteur (ou non connecté) entre les différents points de vue de ma demande.

J'ai lu sur internet que, pour atteindre cet objectif, quelqu'un met une variable ($champ d'application.isLogged = true), quelqu'un d'autre utilise des cookies; mais variables javascript et les cookies peuvent être facilement modifiés à l'aide de firebug, ou similaire, des outils de développement.

... et enfin, la question:

Alors, avez-vous des suggestion pour atteindre un coffre-fort système d'authentification dans une application angularjs?

54voto

fdreger Points 5910

Vous ne pouvez pas autoriser quoi que ce soit dans angularjs, parce que l'utilisateur a le plein contrôle de l'environnement d'exécution (à savoir, le navigateur). Chaque case, cas, si tout ce que vous pouvez penser - peut être altéré. Il y a des bibliothèques javascript qui utilisent des clés asymétriques pour effectuer le chiffrement local pour stocker les données locales à peu près en sécurité, mais ils ne sont pas ce que vous cherchez, vraiment.

Vous pouvez, et vous devez autoriser des choses sur le serveur - le standard de la façon dont vous le feriez dans une application ordinaire - à l'aide de session; aucun code spécial n'est nécessaire, les appels ajax utilisation ordinaire des cookies de session. L'Application n'a pas besoin de savoir si c'est authentifié ou non. Il a seulement besoin de vérifier que le serveur pense.

Du point de vue de votre application angularjs, d'être "connecté" ou "déconnecté" est simplement une interface graphique de l'indice pour l'utilisateur.

47voto

Alexandru Rada Points 1331

Probablement vous avez trouvé une solution, mais pour l'instant j'ai fait un authenticaiton que je suis en œuvre dans mon Angulaire de l'App.

Sur .exécuter l'application est enregistrée avec une ActiveSession définie sur false. Il vérifie ensuite si le navigateur a un cookie avec un jeton et un identifiant.

Si OUI, vérifiez jeton+nom d'utilisateur sur le serveur et les mises à jour le jeton sur le serveur et en local (jeton c'est un générées par le serveur de clé unique pour chaque utilisateur)

Si PAS de montre formulaire de connexion, vérifiez les informations d'identification et encore si ils sont valables un serveur de demande t obtenir un nouveau jeton et enregistre localement.

Le jeton est utilisé pour faire une connexion persistante (souvenez-vous de moi pendant 3 semaines) ou lorsque l'utilisateur actualise la page du navigateur.

Merci

Authentication Scheme in Angular.js

18voto

Bruno Points 2804

Ont passé 3 mois depuis que j'ai posé cette question... et maintenant, je voudrais partager ce qui est devenu mon préféré approche lorsque j'ai à traiter avec authentification de l'utilisateur dans une application web construit sur angularjs.

Bien sûr fdreger la réponse est encore une grande réponse...

Vous ne pouvez pas autoriser quoi que ce soit dans angularjs, parce que l'utilisateur a l'entière le contrôle de l'environnement d'exécution (à savoir, le navigateur).

Du point de vue de votre application angularjs, d'être "connecté" ou "déconnecté" est simplement une interface graphique de l'indice pour l'utilisateur.

Donc, brièvement ma démarche consiste à:

1) lier à chaque itinéraire des informations supplémentaires sur la route elle-même.

$routeProvider.when('/login', { 
    templateUrl: 'partials/login.html', controller: 'loginCtrl', isFree: true
});

2) utiliser un service de mantain les données sur l'utilisateur et de son statut d'authentification.

services.factory('User', [function() {
    return {
        isLogged: false,
        username: ''
    };
}]);

3) chaque fois que l'utilisateur essaie d'accéder à une nouvelle route, vérifier si il a de la subvention à l'accès.

$root.$on('$routeChangeStart', function(event, currRoute, prevRoute){
    // prevRoute.isFree tell me if this route is available for all the users, or only for registered user.
    // User.isLogged tell me if the user is logged
})

J'ai également écrit au sujet de cette approche (plus en détail) sur mon blog, les utilisateurs de l'authentification avec angularjs.

4voto

AVGP Points 181

Tout d'abord: des données côté Client peut toujours être manipulées ou modifiées.

Tant que valide Id de session ne sont pas facilement deviner et ce type de mesures associant les jetons de session avec l'IP du client n'est pas une grosse affaire à ce sujet.

Vous pouvez, en théorie, aussi chiffrer le cookie, aussi longtemps que vous le faites sur le côté serveur.

Pour plus de détails sur la façon de crypter vos cookies, consultez la documentation de votre côté serveur (e.g http://expressjs.com/api.html#res.cookie pour Express.js)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X