it-swarm.com.de

Absichern meiner REST API mit OAuth, wobei die Authentifizierung über Drittanbieter weiterhin zulässig ist OAuth Anbieter (mit DotNetOpenAuth)

Ich habe ein Produkt mit einer einfachen REST API, sodass Benutzer des Produkts direkt in die Funktionen des Produkts integriert werden können, ohne meine Webbenutzeroberfläche zu verwenden.

Vor kurzem haben mich verschiedene Drittanbieter daran interessiert, ihre Desktop-Clients in die API zu integrieren, damit Benutzer meines Produkts mit dieser Drittanbieteranwendung auf ihre Daten zugreifen können.

Ich habe gesehen, dass sich Anwendungen, die Twitter verwenden möchten, über eine von Twitter gehostete Anmeldeseite authentifizieren, die eine bestimmte Anwendungsberechtigung für den Zugriff auf die Daten dieses Benutzers erteilt. Sie klicken auf die Schaltfläche "Zulassen" oder "Verweigern" und der Authentifizierungsvorgang ist abgeschlossen. Facebook verwendet den gleichen Mechanismus, wie ich es beurteilen kann.

Nach weiteren Untersuchungen scheint dies OAuth in Aktion zu sein, und da meine API auf .NET basiert, denke ich, ich sollte DotNetOpenAuth verwenden und einen ähnlichen Mechanismus bereitstellen. Leider sind die Beispiele (wenn überhaupt) spärlich dokumentiert, und die einzigen Tutorials, die ich online finden kann, scheinen darauf ausgerichtet zu sein, Ihnen dabei zu helfen, Ihren Benutzern einen Anmeldemechanismus zur Verfügung zu stellen, damit sie sich über einen Drittanbieter bei Ihrer Website anmelden können.

Was ich wirklich gerne tun würde, ist, dass meine REST API die gesamte Kernauthentifizierung und Geschäftslogik für meine Webanwendung abwickelt und dass meine Webanwendung im Grunde genommen eine andere Anwendung ist das nutzt nur die API über OAuth. Die Benutzer authentifizierten sich auf der Website entweder direkt mit ihrem Benutzernamen und Kennwort oder über einen Drittanbieter wie MyOpenID oder Facebook. Anschließend verwendete die Website das zurückgegebene Token zur Authentifizierung gegenüber der API REST.

Architectural Diagram

Es sieht im Grunde so aus, als ob ich meine API brauche, um einen OAuth - Dienst zu hosten, aber Benutzer müssen auch einen OAuth -Dienst eines Drittanbieters verwenden. Ich kann nicht anders, als zu glauben, ich habe nicht genug Verständnis für OAuth, um zu entscheiden, ob ich Dinge überkompliziere oder ob das, was ich versuche, eine gute oder schlechte Art ist, Dinge zu tun.

Kann mir jemand zumindest einen umfassenden Überblick über die Schritte geben, die ich ausführen muss, oder worauf ich achten sollte, um dies zu erreichen? Oder zeigst du mir ein paar Tutorials? Oder meinen Vorschlag in die Luft sprengen und mir sagen, dass ich (architektonisch) alles falsch mache?

138
Nathan Ridley

Zunächst möchte ich den Unterschied zwischen Authentifizierung und Autorisierung hervorheben:

Ein Benutzer authentifiziert sich bei Ihrer Website, indem er einen Berechtigungsnachweis wie einen Benutzernamen und ein Kennwort angibt. OpenID ermöglicht dies, indem sich der Benutzer bei einem anderen Dienst authentifiziert , der dann die Identität des Benutzers im Namen des Benutzers für Ihre Website bestätigt. Ihre Site vertraut dem Dienst eines Drittanbieters (dem OpenID-Anbieter) und berücksichtigt daher den angemeldeten Benutzer.

Eine Dienst- oder Anwendung authentifiziert sich nicht bei Ihrer Website - unter zumindest nicht typisch. Ein Benutzer autorisiert einen Dienst oder eine Anwendung, auf die Daten des Benutzers zuzugreifen. Dies geschieht normalerweise, indem die Anwendung die Autorisierung des Diensteanbieters anfordert und den Benutzer dann an den Diensteanbieter sendet, wo der Benutzer sich zuerst authentifiziert (damit der Diensteanbieter weiß, mit wem er spricht) und dann der Benutzer zu der Site sagt: "Ja, Es ist in Ordnung für [Anwendung], auf meine Daten zuzugreifen [auf eine eingeschränkte Weise] ". Von da an verwendet die Anwendung ein Autorisierungstoken , um auf die Benutzerdaten auf der Website des Dienstanbieters zuzugreifen. Beachten Sie, dass sich die Anwendung nicht als Benutzer authentifiziert, sondern einen anderen Code verwendet, um sicherzustellen, dass der Dienst berechtigt ist, auf die Daten eines bestimmten Benutzers zuzugreifen.

Wenn diese Unterscheidung klargestellt ist, können Sie auf Ihrer Website völlig unabhängig Entscheidungen zur Authentifizierung und Autorisierung treffen. Wenn Sie beispielsweise möchten, dass sich Ihre Benutzer mit allen folgenden Elementen anmelden können: Benutzername + Kennwort, OpenID und Facebook, können Sie dies tun. Eine völlig orthogonale Entscheidung ist, wie Sie Anwendungen autorisieren (es gibt viele Protokolle, die Sie dafür verwenden können, wobei OAuth natürlich recht beliebt ist).

OpenID konzentriert sich auf die Benutzerauthentifizierung . OAuth konzentriert sich auf die Anwendungsberechtigung . Einige Dienste wie Facebook und Twitter haben sich jedoch dafür entschieden, OAuth für die Authentifizierung und anstelle von OpenID für die Authentifizierung und zu verwenden OAuth zur Autorisierung.

Für Ihr eigenes Projekt empfehle ich dringend, die in der VS-Galerie verfügbare Projektvorlage ASP.NET MVC 2 OpenID-Website (C #) zu besuchen. Es wird standardmäßig mit OpenID-Authentifizierung und OAuth Service Provider-Unterstützung geliefert. Dies bedeutet, dass sich Ihre Benutzer mit OpenID anmelden können und Anwendungen und Dienste von Drittanbietern OAuth verwenden können, um API-Aufrufe auf Ihre Website zu tätigen und auf Benutzerdaten zuzugreifen.

Es hört sich so an, als ob Sie dieser Projektvorlage hinzufügen möchten, sobald Sie loslegen, dass sich Ihre Benutzer mit Benutzername und Kennwort sowie mit OpenID anmelden können. Wenn Sie möchten, dass Facebook und Twitter eine Option für Ihre Benutzer sind, müssen Sie dies ebenfalls implementieren, da sie nicht den OpenID-Standard verwenden. Der DotNetOpenAuth-Download enthält jedoch Beispiele für die Anmeldung bei Twitter und Facebook.

Ich vermute, Sie werden nicht viel zu tun haben, wenn es um die Autorisierung geht. Es kommt mit OAuth, wie ich zuvor sagte, und das wird wahrscheinlich für Sie ausreichen.

123
Andrew Arnott

Als allererstes. Sie müssen Ihre API mental von den Authentifizierungsmethoden trennen.

Ihre API besteht im Wesentlichen aus Ressourcen und Methoden zum Bearbeiten dieser Ressourcen. Sie haben verschiedene Methoden, um den Zugriff auf Ihre API zu authentifizieren.

OAuth ist ein solcher Authentifizierungsmechanismus. Es ist großartig, ein OAuth - Anbieter zu sein, auch wenn die Spezifikation etwas schwer zu verstehen ist, insbesondere die Teile, die mit Signaturen zu tun haben. Sobald Sie OAuth Kundenanwendungen können in der Regel problemlos authentifiziert werden, da in den meisten Sprachen so viele "Open Source" -Bibliotheken bereits vorhanden sind, die nur implementiert werden müssen.

Die Vor- und Nachteile von OAuth) sind schon eine Weile diskutiert worden. Aber um sich eine eigene Meinung zu bilden, schlage ich vor zu lesen dieser endgültige Leitfaden, geschrieben von Eran Hammer-Lahav , eins der Personen, die für die OAuth Spezifikation verantwortlich sind.

Die einzigen wirklichen Alternativen zu OAuth, soweit ich das sehe, sind OAuth 2.0 und nur einfache Basisauthentifizierung.

Ansonsten geht es um die Authentifizierung mithilfe von Open-ID, Facebook-Identität usw. Dies ist eine weitere Frage, die Sie sich stellen müssen. Es fällt jedoch wirklich nicht in den Anwendungsbereich von APIs und OAuth. Für mich ist das eher eine Frage der Benutzererstellung in Ihrem Dienst. Ich kann mich irren.

11
Jon Nylander