web-dev-qa-db-de.com

Wie erreiche ich ein sicheres (!) Authentifizierungssystem in einer anglejs-App?

Ich bin neu bei Anglejs ...

Ich habe die Dokumente gelesen und das Tutorial abgeschlossen. Ich habe auch etwas anderes selbst ausprobiert, und die Dinge fangen an, für mich Sinn zu machen.

Nun frage ich mich, wie man ein sicheres Authentifizierungssystem erstellt.

Der einfache Teil: kein Code, ich werde Operationen beschreiben, die mein Code ausführt:

Ich habe ein klassisches Formular: Benutzername und Passwort-Texteingabe.

Der Benutzer füllt das Formular aus und drückt die EINGABETASTE. 

Eine Ajax-Anforderung wird gestartet, und die Antwort wird von einem JSON mit der Meldung .__ angezeigt. etwas wie "ok, ich kenne dich" oder "Ich weiß nicht, wer du bist".

Was ich jetzt brauche, ist, den protokollierten Status des Besuchers (oder nicht protokolliert) zwischen den verschiedenen Ansichten meiner Anwendung zu erhalten.

Ich habe im Internet gelesen, dass jemand zum Erreichen dieses Ziels eine Variable setzt ($ scope.isLogged = true), jemand anderes Cookies verwendet; JavaScript-Variablen und Cookies können jedoch problemlos mit Firebug oder ähnlichen Entwicklungswerkzeugen bearbeitet werden.

... und zum Schluss noch die Frage:

haben Sie einen Vorschlag, ein sicheres Authentifizierungssystem in einer anglejs-App zu erreichen?

57
Bruno

Sie können nichts in eckigerjs autorisieren, da der Benutzer die vollständige Kontrolle über die Ausführungsumgebung (dh den Browser) hat. Jede Prüfung, Fall, ob - alles, was Sie sich vorstellen können - kann manipuliert werden. Es gibt Javascript-Bibliotheken, die zur lokalen Verschlüsselung lokale Daten durch asymmetrische Schlüssel einigermaßen sicher speichern, aber sie sind nicht das, wonach Sie suchen.

Sie können und sollten Dinge auf dem Server autorisieren - so wie Sie es normalerweise in einer normalen Anwendung tun würden - mithilfe einer Sitzung. ajax-anrufe verwenden gewöhnliche sitzungscookies. Die Anwendung muss nicht wissen, ob sie authentifiziert ist oder nicht. Es muss nur geprüft werden, was der Server denkt.

Aus der Sicht Ihrer anglejs-Anwendung ist das "Abmelden" oder "Abmelden" lediglich ein Hinweis für den Benutzer.

54
fdreger

Wahrscheinlich haben Sie eine Lösung gefunden, aber derzeit habe ich ein Authentifizierungsschema erstellt, das ich in meiner Angular App implementiere. 

Bei .run ist die App mit einer auf false ..__ eingestellten ActiveSession registriert. Anschließend wird geprüft, ob der Browser ein Cookie mit einem Token und einer Benutzer-ID enthält.

Wenn ja, prüfen Sie Token + Benutzer-ID auf dem Server und aktualisieren das Token sowohl auf dem Server als auch auf dem lokalen (Token ist ein vom Server generierter Schlüssel, der für jeden Benutzer eindeutig ist).

Wenn NEIN das Anmeldeformular angezeigt wird, überprüfen Sie die Anmeldeinformationen. Wenn sie gültig sind, wird erneut eine Serveranfrage abgerufen. Ein neues Token wird gespeichert, und es wird lokal gespeichert.

Das Token wird verwendet, um eine dauerhafte Anmeldung vorzunehmen (3 Wochen lang an mich erinnern) oder wenn der Benutzer die Browserseite aktualisiert.

Vielen Dank

Authentication Scheme in Angular.js

47
Alexandru Rada

Ich habe diese Frage vor drei Monaten gestellt.

Ich möchte mitteilen, was zu meinem Lieblingsansatz geworden ist, wenn ich mich mit der Benutzerauthentifizierung in einer über AngularJS erstellten Web-App beschäftigen muss.

Natürlich ist die Antwort von fdreger immer noch eine großartige Antwort!

Sie können nichts in eckigenjs autorisieren, da der Benutzer die vollständige Kontrolle der Ausführungsumgebung (nämlich des Browsers).

Aus der Perspektive Ihrer Winkeljs-Anwendung: "eingeloggt" oder "Abgemeldet" ist lediglich ein Hinweis für den Benutzer.

Kurz gesagt besteht mein Ansatz darin:

1) Binden Sie an jede Route zusätzliche Informationen zur Route selbst.

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

2) Verwenden Sie einen Dienst, um die Daten zu jedem Benutzer und dessen Authentifizierungsstatus zu verwalten.

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

3) Jedes Mal, wenn der Benutzer versucht, auf eine neue Route zuzugreifen, prüfen Sie, ob er Zugriff hat.

$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
})

Ich habe über diesen Ansatz (ausführlicher) auch in meinem Blog geschrieben, Benutzerauthentifizierung mit eckigenjs .

18
Bruno

Erstens: Clientseitige Daten können jederzeit manipuliert oder manipuliert werden.

Solange gültige Sitzungs-IDs nicht leicht erraten werden können und Maßnahmen wie das Verknüpfen von Sitzungs-Token mit der IP des Clients, gibt es keine große Sache.

Theoretisch könnten Sie das Cookie auch verschlüsseln, sofern Sie dies auf der Serverseite tun.

Einzelheiten zum Verschlüsseln von Cookies finden Sie in den Dokumenten Ihrer Serverseite (z. B. http://expressjs.com/api.html#res.cookie für Express.js).

4
geekonaut

Sie müssen etwas über das Server-/Datenbankende erfahren.

Benutzeranmeldungen müssen irgendwo gespeichert werden - 99,9% der Zeit, in der sich dies in einer serverseitigen Datenbank befindet. 

Ideal für ein wirklich sicheres System ist ein Backend-Mitgliedersystem (serverseitig), das die Sitzung in einer Datenbanktabelle speichert, die sich auf die Mitgliedstabelle bezieht, die das verschlüsselte Kennwort enthält, aber auch eine RESTful-Schnittstelle für die Erstellung von API-Aufrufen bietet zu.

Ein Skript, das ich erfolgreich verwendet habe, war Amember https://www.amember.com/ . Es ist ein wirklich kostengünstiger Weg, obwohl es eine Menge anderer Skripte gibt. Ich hatte viel Erfolg mit diesem Skript. Es ist auch PHP, so dass Sie eine API für Ihr Programm erstellen können eckige http-Aufrufe sind wirklich einfach.

Alle diese Javascript-Frameworks sind großartig, aber der Effekt ist, dass sich jetzt zu viele auf das Frontend der Dinge konzentrieren - lernen Sie auch die Datenbank/das Backend! :-)

0
webmaster_sean