2010-05-20 10 views
6

Ich entwickle einen Web-Service und ich muss einen Benutzernamen und ein Passwort an den Service in einer GET-Methode senden. Ist es in Ordnung, diese Informationen in der URI zu senden, solange es über einen sicheren Kanal wie SSL läuft? Mit anderen Worten, kann ich ein URI haben, das wie/users/{username}/{cleartext_password} aussieht?Senden von Benutzername und Passwort an Web-Service

Edit: Sorry, ich glaube ich war unklar. Der Web-Service ist im Wesentlichen nur eine Datenbank mit Benutzernamen und Hash-Passwörtern. Stellen Sie sich eine Desktop-Anwendung vor, die Benutzernamen und Kennwörter in einer entfernten Datenbank speichert. Der Endbenutzer gibt seinen Benutzernamen und sein Kennwort in die Anwendung ein, und die Anwendung greift auf den Webdienst zu, um den Benutzer zu authentifizieren.

Die Anwendung muss daher den Benutzernamen und das Klartextkennwort des Endbenutzers an den Dienst senden. Der Dienst übernimmt den Benutzernamen und das Passwort und überprüft, ob der Benutzername und der Hash des Passworts mit dem Benutzernamen und dem Hash-Passwort in der Datenbank übereinstimmen. Die Anwendung selbst muss sich authentifizieren, bevor sie auf den Dienst zugreifen kann, aber ich frage mich nur, wie der Benutzername und das Kennwort des Endbenutzers am besten zum Authentifizieren des Endbenutzers an den Dienst gesendet werden. Ich verwende keine POST-Methode, da ich mich einfach authentifiziere und den Status des Servers nicht verändere. Entschuldigung für die Verwirrung.

Antwort

0

Im Allgemeinen ist dies keine gute Idee ... Diese Daten werden in einer Reihe von Protokolldateien vorhanden sein, folglich könnten die Daten für Personen sichtbar sein, die sie nicht sehen sollten. Zumindest sollten Sie es Hash oder verschlüsseln, bevor Sie es senden, wenn Sie können.

Hier ist eine ähnliche Diskussion für ein wenig mehr Detail ... Is an HTTPS query string secure?

+0

Oder Sie könnten in Zwei-Wege-SSL-Authentifizierung zu tun.Benutzer benötigen Zertifikate auf die gleiche Weise wie Server, aber der Server kann den Benutzer dann sicher authentifizieren. – mpez0

0

Wenn es über einen sicheren Kanal geht, gibt es kein Problem, die Benutzername und das Kennwort als unverschlüsselt zu senden. Ich würde nur empfehlen, sie niemals als Klartext durch einen unsicheren Kanal zu senden und sie nicht wiederholt für jede Anfrage zu senden.

Was Sie tun könnten, ist zunächst authentifizieren Sie den Web-Service (senden Sie den Benutzernamen und das Passwort via SSL als Klartext) und erhalten ein Token vom Server, die es erkennen wird. Dann senden Sie dieses Token mit jeder weiteren Anfrage.

+0

Google ermöglicht Ihnen beispielsweise, Ihren Benutzernamen und Ihr Passwort über SSL zu senden, um eine SID für ihre API abzurufen. Anschließend senden Sie diese SID in einem Cookie mit jeder nachfolgenden GET-Anfrage. Es funktioniert gut. – EAMann

7

Tun Sie dies.

Senden Sie einen "Schlüssel" und einen "Digest".

Der "Schlüssel" entspricht einem Benutzernamen.

Der "Digest" ist ein SHA1 (oder MD5) Hash des Schlüssels, der URI und eines "shared secret" oder Passworts.

Wenn der Server dies bekommt, berechnet er seine eigene Version des Digests, basierend auf dem Schlüssel, dem URI, der angefordert wird, und dem "shared secret" oder Passwort. Das Nichtübereinstimmen von Digests ist eine 401-Fehlerantwort.

+0

Das ist eigentlich eine sehr elegante Lösung ... – EAMann

0

SSL verschlüsselt den URI, aber sehen Sie sich auf jeden Fall einige Alternativen an.

HTTP Basic Auth ist schön und einfach, und auch von Browsern, Web-Servern unterstützt, etc

Es wird nicht auch in Protokolldateien im gleichen Maße wie URIs am Ende

NB: Es ist nur einige Klartext-HTTP-Header, also definitiv NICHT für Nicht-SSL-Anwendungen empfohlen.

http://en.wikipedia.org/wiki/Basic_access_authentication