Es gibt verschiedene Schemata zum Authentifizieren von API-Anfragen. Diese unterscheiden sich von der normalen Authentifizierung, die von Plugins wie restful_authentication oder acts_as_authenticated bereitgestellt wird. Am wichtigsten ist, dass Clients keine Sitzungen verwalten, daher gibt es kein Konzept für eine Anmeldung.
HTTP-Authentifizierung
können Sie grundlegende HTTP-Authentifizierung verwenden. Dazu werden API-Clients einen regulären Benutzername und Passwort verwenden und es nur in der URL setzen wie so:
http://myusername:[email protected]/
glaube ich, dass restful_authentication dies aus der Box unterstützt, so dass Sie, ob jemand ignorieren können, ist mit Ihre App über die API oder über einen Browser.
Ein Nachteil hier ist, dass Sie Benutzer sind gefragt ihre Benutzername und das Passwort im Klartext in jeder Anfrage zu stellen. Indem Sie dies über SSL tun, können Sie dies sicher machen.
Ich glaube nicht, dass ich jemals tatsächlich eine API gesehen habe, die dies verwendet. Es scheint mir eine anständige Idee zu sein, zumal es von den aktuellen Authentifizierungsschemata sofort unterstützt wird, daher weiß ich nicht, was das Problem ist.
API Key
Eine weitere einfache Möglichkeit API-Authentifizierung zu aktivieren ist API-Schlüssel zu verwenden. Es ist im Wesentlichen ein Benutzername für einen Remote-Dienst. Wenn sich jemand für die Verwendung Ihrer API anmeldet, geben Sie ihm einen API-Schlüssel. Dies muss bei jeder Anfrage bestanden werden.
Ein Nachteil dabei ist, dass, wenn jemand API jemand anderen Schlüssel bekommt, können sie diesen Benutzer Anfragen in so. Ich denke, wenn Sie alle Ihre API-Anfragen HTTPS (SSL) verwenden, können Sie dieses Risiko etwas ausgleichen.
Ein weiterer Nachteil ist, dass die Benutzer die gleichen Authentifizierungsinformationen verwenden (die API-Schlüssel) überall sie gehen. Wenn sie den Zugriff auf einen API-Client widerrufen wollen, besteht die einzige Möglichkeit darin, ihren API-Schlüssel zu ändern, wodurch auch alle anderen Clients deaktiviert werden. Dies kann gemildert werden, indem Benutzern ermöglicht wird, mehrere API-Schlüssel zu generieren.
API Key + Secret Key Unterzeichnung
Veraltet (Art) - siehe OAuth unter
Deutlich komplexer ist die Anforderung mit einem geheimen Schlüssel signieren. Dies ist, was Amazon Web Services (S3, EC2 und so) tun. Im Wesentlichen geben Sie dem Benutzer zwei Schlüssel: seinen API-Schlüssel (dh seinen Benutzernamen) und seinen geheimen Schlüssel (dh sein Passwort). Der API-Schlüssel wird mit jeder Anfrage übertragen, der geheime Schlüssel jedoch nicht. Stattdessen wird es zum Signieren jeder Anfrage verwendet, normalerweise durch Hinzufügen eines anderen Parameters.
IIRC, erreicht Amazon dies auf die Anforderung alle Parameter nehmen und sie durch Parameternamen zu bestellen. Dann wird diese Zeichenfolge gehashed, wobei der geheime Schlüssel des Benutzers als Hash-Schlüssel verwendet wird. Dieser neue Wert wird als neuer Parameter an die Anfrage angehängt, bevor sie gesendet wird. Auf der Seite von Amazon tun sie das Gleiche. Sie nehmen alle Parameter (außer der Signatur), ordnen sie an und haseln mit dem geheimen Schlüssel. Wenn dies mit der Signatur übereinstimmt, wissen sie, dass die Anfrage legitim ist.
Der Nachteil ist hier Komplexität. Die korrekte Funktionsweise dieses Schemas ist sowohl für den API-Entwickler als auch für die Clients ein Problem. Erwarten Sie viele Support-Anrufe und wütende E-Mails von Client-Entwicklern, die Dinge nicht zum Laufen bringen können.
OAuth
, um einige der Komplexität Probleme mit Schlüssel + geheimen Unterschrifts zu bekämpfen, hat sich zu einem Standard OAuth genannt entwickelt. Im Kern ist OAuth eine Variante von Key + Secret Signing, aber vieles davon ist standardisiert und wurde in libraries for many languages aufgenommen.
Im Allgemeinen ist es sowohl für den API-Produzenten als auch für den Konsumenten viel einfacher, OAuth zu verwenden, als ein eigenes Schlüssel/Signatur-System zu erstellen.
OAuth segmentiert auch inhärent den Zugriff und stellt unterschiedliche Zugangsdaten für jeden API-Benutzer bereit. Dadurch können Benutzer den Zugriff selektiv widerrufen, ohne ihre anderen konsumierenden Anwendungen zu beeinträchtigen.
Speziell für Ruby gibt es eine OAuth gem, die Unterstützung für OAuth-Produzenten und -Käufer bietet. Ich habe dieses Juwel verwendet, um eine API zu erstellen und auch OAuth APIs zu konsumieren und war sehr beeindruckt. Wenn Sie der Meinung sind, dass Ihre Anwendung OAuth benötigt (im Gegensatz zum einfacheren API-Schlüsselschema), kann ich Ihnen die Verwendung des OAuth-Edelsteins empfehlen.
Wenn der Client weiß, wie er Ihre URIs manipuliert (durch Anhängen von .xml oder anderen), dann ist Ihre API nicht REST. – aehlke
das ist eine gute Oauth 2.0 Server-Bibliothek für Ruby https://github.com/Lelylan/rest-oauth2-server – sparkle