Ich erstelle eine Webanwendung mit einer Serviceschicht. Die Serviceschicht wird mit einem RESTful-Design erstellt. Es wird davon ausgegangen, dass wir in Zukunft möglicherweise andere Anwendungen (iPhone, Android usw.) erstellen, die dieselbe Serviceschicht wie die Webanwendung verwenden. Meine Frage lautet: Wie implementiere ich die Anmeldung? Ich glaube, ich habe Probleme beim Übergang von einem traditionelleren verbbasierten Design zu einem ressourcenbasierten Design. Wenn ich dies mit SOAP erstellen würde, hätte ich wahrscheinlich eine Methode namens Login. In REST sollte ich eine Ressource haben. Ich habe Schwierigkeiten zu verstehen, wie ich meine URI für eine Anmeldung erstellen soll. Sollte es so etwas sein:
http: // myservice / {Benutzername}? p = {Passwort}
BEARBEITEN: Die Front-End-Webanwendung verwendet das traditionelle ASP.NET-Framework zur Authentifizierung. Irgendwann im Authentifizierungsprozess muss ich jedoch die angegebenen Anmeldeinformationen überprüfen. In einer herkömmlichen Webanwendung würde ich eine Datenbanksuche durchführen. In diesem Szenario rufe ich jedoch einen Dienst auf, anstatt eine Datenbanksuche durchzuführen. Ich benötige also etwas im Dienst, das die angegebenen Anmeldeinformationen überprüft. Zusätzlich zur Validierung der angegebenen Anmeldeinformationen benötige ich wahrscheinlich auch Informationen über den Benutzer, nachdem er sich erfolgreich authentifiziert hat - Dinge wie sein vollständiger Name, seine ID usw. Ich hoffe, dies macht die Frage klarer.
Oder denke ich nicht richtig darüber nach? Ich habe das Gefühl, dass ich Schwierigkeiten habe, meine Frage richtig zu beschreiben.
Corey
quelle
Sie "loggen" sich nicht ein. Sie "authentifizieren" sich. Welt des Unterschieds.
Sie haben viele Authentifizierungsalternativen.
HTTP Basic-, Digest-, NTLM- und AWS S3-Authentifizierung
HTTP Basic- und Digest-Authentifizierung. Dies verwendet den
HTTP_AUTHORIZATION
Header. Das ist sehr schön, sehr einfach. Kann aber zu viel Verkehr führen.Authentifizierung mit Benutzername / Signatur. Wird manchmal als "ID and KEY" -Authentifizierung bezeichnet. Dies kann eine Abfragezeichenfolge verwenden.
?username=this&signature=some-big-hex-digest
Dies ist, was Orte wie Amazon verwenden. Der Benutzername ist die "ID". Der "Schlüssel" ist ein Digest, ähnlich dem für die HTTP-Digest-Authentifizierung verwendeten. Beide Seiten müssen sich auf die Verdauung einigen, um fortzufahren.
Eine Art Cookie-basierte Authentifizierung. OpenAM kann beispielsweise als Agent konfiguriert werden, um ein Cookie zu authentifizieren und bereitzustellen, das Ihr RESTful-Webserver dann verwenden kann. Der Client würde sich zuerst authentifizieren und dann das Cookie mit jeder RESTful-Anforderung bereitstellen.
quelle
Gute Frage, gut gestellt. Ich mag Patricks Antwort wirklich. Ich benutze so etwas wie
- / users / {Benutzername} / loginsession
Mit POST und GET behandelt. Ich poste also eine neue Anmeldesitzung mit Anmeldeinformationen und kann dann die aktuelle Sitzung über das GET als Ressource anzeigen.
Die Ressource ist eine Anmeldesitzung, die möglicherweise über ein Zugriffstoken oder einen Authentifizierungscode, einen Ablauf usw. verfügt.
Seltsamerweise muss mein MVC-Aufrufer selbst ein Schlüssel- / Inhaber-Token über einen Header präsentieren, um zu beweisen, dass er das Recht hat, neue Anmeldesitzungen zu erstellen, da die MVC-Site ein Client der API ist.
Bearbeiten
Ich denke, einige andere Antworten und Kommentare hier lösen das Problem mit einem gemeinsamen Out-of-Band-Geheimnis und authentifizieren sich nur mit einem Header. Das ist in vielen Situationen oder für Service-to-Service-Anrufe in Ordnung.
Die andere Lösung besteht darin, ein Token, OAuth oder JWT oder auf andere Weise zu fließen. Dies bedeutet, dass die "Anmeldung" bereits von einem anderen Prozess durchgeführt wurde, wahrscheinlich einer normalen Anmelde-Benutzeroberfläche in einem Browser, der auf einem Formular-POST basiert.
Meine Antwort bezieht sich auf den Dienst, der sich hinter dieser Benutzeroberfläche befindet, vorausgesetzt, Sie möchten, dass Anmeldung und Authentifizierung sowie Benutzerverwaltung in einem REST-Dienst und nicht im Site-MVC-Code platziert werden. Es ist der Benutzeranmeldedienst.
Es ermöglicht auch anderen Diensten, sich anzumelden und ein ablaufendes Token zu erhalten, anstatt einen vorinstallierten Schlüssel zu verwenden, sowie Testskripte in einer CLI oder einem Postboten.
quelle
Da hat sich seit 2011 einiges geändert ...
Wenn Sie bereit sind, ein Tool eines Drittanbieters zu verwenden und geringfügig von REST für die Web-Benutzeroberfläche abweichen, ziehen Sie http://shiro.apache.org in Betracht .
Shiro bietet Ihnen grundsätzlich einen Servlet-Filter, der sowohl zur Authentifizierung als auch zur Autorisierung dient. Sie können alle von @ S.Lott aufgelisteten Anmeldemethoden verwenden, einschließlich einer einfachen formularbasierten Authentifizierung.
Filtern Sie die restlichen URLs, für die eine Authentifizierung erforderlich ist, und Shiro erledigt den Rest.
Ich verwende dies derzeit in meinem eigenen Projekt und es hat bisher ziemlich gut für mich funktioniert.
Hier ist noch etwas, an dem die Leute interessiert sein könnten. Https://github.com/PE-INTERNATIONAL/shiro-jersey#readme
quelle
Das erste, was Sie über REST wissen sollten, ist, dass es sich um einen Token-basierten Ressourcenzugriff handelt. Im Gegensatz zu herkömmlichen Methoden wird der Zugriff auf der Grundlage der Token-Validierung gewährt. Mit einfachen Worten, wenn Sie das richtige Token haben, können Sie auf Ressourcen zugreifen. Jetzt gibt es viele andere Dinge für die Erstellung und Manipulation von Token.
Für Ihre erste Frage können Sie eine Restfull-API entwerfen. Anmeldeinformationen (Benutzername und Kennwort) werden an Ihre Serviceschicht übergeben. Die Serviceschicht überprüft diese Anmeldeinformationen und gewährt ein Token. Anmeldeinformationen können entweder ein einfacher Benutzername / ein einfaches Kennwort oder SSL-Zertifikate sein. SSL-Zertifikate verwenden das OAUTH-Protokoll und sind sicherer.
Sie können Ihren URI wie folgt gestalten: URI für Token-Anforderung-> http: // myservice / some-directory / token ? (Sie können Credentilals in dieser URI für Token übergeben)
Um dieses Token für den Ressourcenzugriff zu verwenden, können Sie dieses [Berechtigung: Träger (Token)] zu Ihrem http-Header hinzufügen.
Dieses Token kann vom Kunden verwendet werden, um auf verschiedene Komponenten Ihrer Serviceschicht zuzugreifen. Sie können auch die Ablaufdauer dieses Tokens ändern, um Missbrauch zu verhindern.
Bei Ihrer zweiten Frage können Sie verschiedene Token gewähren, um auf verschiedene Ressourcenkomponenten Ihrer Serviceschicht zuzugreifen. Dazu können Sie Ressourcenparameter in Ihrem Token und die Berechtigung basierend auf diesem Feld angeben.
Sie können diesen Links auch folgen, um weitere Informationen zu erhalten: http://www.codeproject.com/Articles/687647/Detailed-Tutorial-for-Building-ASP-NET-WebAPI-REST
http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
quelle
Ich habe das gleiche Problem schon einmal gesehen. Die Anmeldung lässt sich nicht gut auf ressourcenbasiertes Design übertragen.
Normalerweise gehe ich damit um, indem ich über eine Login-Ressource verfüge und Benutzername und Passwort an die Parameterzeichenfolge übergebe
GET on http: // myservice / login? U = {Benutzername} & p = {Passwort}
Die Antwort ist eine Art Sitzung oder Authentifizierungszeichenfolge, die dann zur Validierung an andere APIs übergeben werden kann.
Eine Alternative zu GET in der Login-Ressource ist ein POST, REST-Puristen werden mich jetzt wahrscheinlich nicht mögen :) und die Creds im Körper weitergeben. Die Antwort wäre die gleiche.
quelle