Überblick
Ich möchte eine (REST) API für meine Anwendung erstellen. Der ursprüngliche Hauptzweck ist der Verbrauch durch mobile Apps (iPhone, Android, Symbian usw.). Ich habe verschiedene Mechanismen zur Authentifizierung und Autorisierung für webbasierte APIs untersucht (indem ich andere Implementierungen untersucht habe). Ich habe mich mit den meisten grundlegenden Konzepten beschäftigt, suche aber immer noch nach Anleitung in einigen Bereichen. Das Letzte, was ich tun möchte, ist, das Rad neu zu erfinden, aber ich finde keine Standardlösungen, die meinen Kriterien entsprechen (obwohl meine Kriterien falsch sind, können Sie dies auch kritisieren). Außerdem möchte ich, dass die API für alle Plattformen / Anwendungen, die sie verwenden, gleich ist.
oAuth
Ich werde meinen Einwand gegen oAuth zurückwerfen, da ich weiß, dass dies wahrscheinlich die erste angebotene Lösung sein wird. Für mobile Anwendungen (oder insbesondere Nicht-Webanwendungen) scheint es einfach falsch, die Anwendung (um zu einem Webbrowser zu gehen) für die Authentifizierung zu verlassen. Darüber hinaus gibt es (wie mir bekannt ist) keine Möglichkeit für den Browser, den Rückruf an die Anwendung zurückzugeben (insbesondere plattformübergreifend). Ich kenne ein paar Apps, die das tun, aber es fühlt sich einfach falsch an und gibt eine Pause in der Anwendung UX.
Bedarf
- Der Benutzer gibt den Benutzernamen / das Passwort in die Anwendung ein.
- Jeder API-Aufruf wird von der aufrufenden Anwendung identifiziert.
- Der Overhead wird auf ein Minimum reduziert und der Authentifizierungsaspekt ist für Entwickler intuitiv.
- Der Mechanismus ist sowohl für den Endbenutzer (ihre Anmeldeinformationen sind nicht verfügbar) als auch für den Entwickler (ihre Anwendungsanmeldeinformationen sind nicht verfügbar) sicher.
- Wenn möglich, benötigen Sie kein https (keineswegs eine harte Anforderung).
Meine aktuellen Gedanken zur Implementierung
Ein externer Entwickler fordert ein API-Konto an. Sie erhalten eine Apikey und Apisecret. Für jede Anfrage sind mindestens drei Parameter erforderlich.
- apikey - wird dem Entwickler bei der Registrierung gegeben
- Zeitstempel - dient gleichzeitig als eindeutige Kennung für jede Nachricht für eine bestimmte Apikey
- Hash - ein Hash des Zeitstempels + des Apisecret
Der Apikey muss die Anwendung identifizieren, die die Anfrage ausstellt. Der Zeitstempel verhält sich ähnlich wie oauth_nonce und vermeidet / mildert Wiederholungsangriffe. Der Hash stellt sicher, dass die Anfrage tatsächlich vom Eigentümer des angegebenen Apikey gestellt wurde.
Bei authentifizierten Anforderungen (die im Auftrag eines Benutzers ausgeführt werden) bin ich immer noch unentschlossen, ob ich eine access_token-Route oder eine Kombination aus Benutzername und Kennwort-Hash verwenden möchte. In jedem Fall ist irgendwann eine Kombination aus Benutzername und Passwort erforderlich. Wenn dies der Fall ist, wird ein Hash mit mehreren Informationen (apikey, apisecret, timestamp) + dem Passwort verwendet. Ich würde gerne Feedback zu diesem Aspekt erhalten. Zu Ihrer Information, sie müssten zuerst das Passwort hashen, da ich die Passwörter nicht ohne Hashing in meinem System speichere.
Fazit
Zu Ihrer Information, dies ist keine Anforderung zum Erstellen / Strukturieren der API im Allgemeinen, sondern nur zum Behandeln der Authentifizierung und Autorisierung ausschließlich innerhalb einer Anwendung.
Zufällige Gedanken / Bonusfragen
Wie können Sie bei APIs, für die nur ein Apikey als Teil der Anforderung erforderlich ist, verhindern, dass eine andere Person als der Apikey-Eigentümer den Apikey sehen kann (seitdem im Klartext gesendet), und übermäßige Anforderungen stellen, um sie über die Nutzungsbeschränkungen zu verschieben? Vielleicht denke ich gerade darüber nach, aber sollte es nicht etwas geben, das bestätigt, dass eine Anfrage an den apikey-Besitzer verifiziert wurde? In meinem Fall, das war der Zweck des Apisecret, wird es niemals gezeigt / übertragen, ohne gehasht zu werden.
Apropos Hashes, was ist mit md5 vs hmac-sha1? Ist es wirklich wichtig, wenn alle Werte mit ausreichend langen Daten (dh Apisecret) gehasht werden?
Ich hatte zuvor darüber nachgedacht, meinem Benutzer ein Passwort-Hash pro Benutzer / Zeile hinzuzufügen. Wenn ich das tun würde, wie könnte die Anwendung einen passenden Hash erstellen, ohne das verwendete Salz zu kennen?