Ich möchte die folgende Architektur (ich habe den Produktnamen für dieses Beispiel erfunden):
Web API 2-Anwendung, die auf einem Server ausgeführt wird http://api.prettypictures.com
MVC 5-Client-App, die auf einem anderen Server ausgeführt wird http://www.webpics.com
Ich möchte, dass die Client-App www.webpics.com die Pretty Pictures-API verwendet, um:
- Registrieren Sie neue Konten mit Benutzername und Passwort
- Registrieren Sie neue Konten bei Facebook / Google / Twitter / Microsoft
- Einloggen
- Bilder abrufen
Alle oben genannten Funktionen funktionieren außer der Registrierung externer Konten bei Facebook, Google usw.
Ich kann nicht den richtigen Ablauf ermitteln, um ein externes Konto von einem separaten Clientbenutzer der API zu erstellen .
Ich habe die meisten im Authentifizierungsablauf verfügbaren Dokumente wie folgt untersucht:
Ich habe so ziemlich alles gelesen, was ich über das neue Identitätsmodell in OWIN kann.
Ich habe die SPA-Vorlage in Visual Studio 2013 untersucht. Sie zeigt, wie ich das meiste tun kann, was ich brauche, aber nur, wenn sich der Client und die API auf demselben Host befinden. Wenn ich möchte, dass mehrere Clients auf meine API zugreifen und Benutzer sich über Google usw. anmelden können, funktioniert dies nicht und soweit ich das beurteilen kann, bricht der OWIN-Authentifizierungsablauf ab.
Hier ist der Fluss bisher:
- Der Benutzer navigiert zu www.webpics.com/Login
- www.webpics.com ruft api.prettypictures.com/Account/ExternalLogins auf (wobei ein returnUrl so eingestellt ist, dass es zu einem Rückruf unter www.webpics.com zurückkehrt ) und zeigt dem Benutzer die resultierenden Links an
- Der Nutzer klickt auf "Google"
- Der Browser leitet mit dem Namen des Anbieters usw. zu api.prettypictures.com/Account/ExternalLogin weiter .
- Die ExternalLogin- Aktion der API instanziiert eine Herausforderung für google.com
- Der Browser wird zu google.com umgeleitet
- Der Nutzer gibt seinen Benutzernamen und sein Passwort ein (sofern er noch nicht bei google.com angemeldet ist ).
- google.com präsentiert jetzt die Sicherheitsüberprüfung: "api.prettypictures.com" möchte Zugriff auf Ihre E-Mail-Adresse, Ihren Namen, Ihre Frau, Ihre Kinder usw. Ist das in Ordnung?
- Der Benutzer klickt auf "Ja" und wird mit einem von Google gesetzten Cookie zu api.prettypictures.com/Account/ExternalLogin zurückgeführt .
Hier stecke ich fest. Was als nächstes passieren soll, ist, dass die Client-App benachrichtigt werden sollte, dass sich der Nutzer erfolgreich bei google.com authentifiziert hat, und einen einmaligen Zugangscode erhalten sollte, um später gegen ein Zugriffstoken auszutauschen. Die Client-App sollte bei Bedarf die Möglichkeit haben, den Benutzer zur Eingabe eines Benutzernamens aufzufordern, der mit seinem google.com- Login verknüpft werden soll .
Ich weiß nicht, wie ich das erleichtern soll.
Zu diesem Zeitpunkt befindet sich der Browser nach dem Rückruf von Google am Endpunkt api.prettypictures.com/Account/ExternalLogin . Die API ist für Google angemeldet, aber der Client weiß nicht, wie er damit umgehen soll. Soll ich diesen Cookie zurück zu www.webpics.com leiten ?
In der SPA-App erfolgt dies über AJAX und google.com gibt ein Token als URL-Fragment zurück und alles funktioniert einwandfrei, da sich alles auf einer Domain befindet. Dies widerspricht jedoch weitgehend dem Sinn einer "API", die mehrere Clients vollständig nutzen können.
Hilfe!