Implementierung von OAuth-2.0-Authentifizierung mit einem Laravel-API
Ich bin derzeit den Aufbau einer web-Anwendung, die in einem AngularJS frontend, die Kommunikation mit einem RESTful API erstellt unter Verwendung von Laravel. Ich mache gute Fortschritte, aber finden es schwer zu bekommen mein Kopf herum, wie zu handhaben Benutzer-Authentifizierung.
Habe ich hingewiesen wurde, ich sollte die Verwendung von OAuth für die Authentifizierung, und ich habe beschlossen, es zu benutzen, wie gesehen, könnte es eine Lernerfahrung für mich. Das Paket, das ich verwende, um diese zu bewältigen ist oauth2-server-laravel.
Den basic-user-Geschichte ist, dass sich Benutzer registrieren können Sie Ihre Benutzername/Passwort-Kombination für die Anwendung, und Sie dann in der Anwendung anmelden mit dem gleichen Benutzernamen und Passwort. Sie sind nur zur Authentifizierung Ihren Benutzernamen und Ihr Kennwort, und nicht von jedem client secret. Nach dem login sollten Sie ein access token ein, die gesendet werden zusammen mit jeder künftigen Anfrage zu authentifizieren, die Sie auf verschiedenen API-Endpunkte.
Die OAuth2-Bibliothek hat ein "Passwort-flow" - grant-Typ zu sein scheint, was ich brauche, aber es dauert auch client_id
und client_secret
Parameter, die ich nicht will. Die request URI ist so etwas wie dieses:
POST https://www.example.com/oauth/access_token?
grant_type=password&
client_id=the_client_id&
client_secret=the_client_secret&
username=the_username&
password=the_password&
scope=scope1,scope2&
state=123456789
Aber was ich will, ist nur:
POST https://www.example.com/oauth/access_token?
grant_type=password&
username=the_username&
password=the_password
Wie bin ich soll eine client-ID und secret of a user, die noch nicht zu authentifizieren?
Gibt es eine andere grant kann ich verwenden, oder ist das, was ich erreichen möchte einfach nicht geeignet für OAuth überhaupt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Berücksichtigen, dass
client id
undclient secret
sind nicht die Parameter, die Sie zwingen, Ihre end-Benutzer zu übergeben. Sie sind statisch und definiert in/für Ihre client-app (angular-app in diesem Fall).Alles, was Sie tun müssen, ist erstellen Sie einen Datensatz für Ihre Haupt-app in
oauth_clients
Tabelle, und erstellen Sie einen Bereich mit vollen Zugriff inoauth_scopes
- Tabelle, und senden Sie diese Werte bei der Anforderung von token.Und das ist alles in der Tat.
Vielleicht möchten Sie auch zu erwägen, implizite Gewährung flow im Fall der Gebäude-js-Anwendung, da das speichern client secret und refresh-Tokens in einer js-app ist unsicher. Mithilfe der impliziten gewähren in ein Endprodukt Aussehen kann wie login-Fenster auf soundcloud und ist sicherer als das token erhalten wird server-side ohne das client-Geheimnis.
Einen anderen Weg zu gehen, wenn Sie immer noch wollen, um das Kennwort-flow erstellen Sie einen proxy für das aktualisieren von Token. Proxy verstecken Sie Ihre refresh-token in verschlüsselter http-cookie, und Ihre js-app Fragen Sie nicht Ihren api für neue token, aber der proxy statt. Proxy liest refresh-token von verschlüsselten cookie, fragt die api für den neuen token und gibt es zurück. Also der refresh-token ist nie ausgesetzt. Wenn Sie token-ttl-für eine Stunde, sagen wir mal, dann stehlen Sie sich einen token wäre ziemlich "sinnlos*" im Falle einer normalen Anwendung, und stehlen refresh-token wäre "unmöglich*".
*Natürlich, wenn jemand wirklich wollen, er hätte wahrscheinlich hacken Sie alle Weg.
Und ja, ich weiß, das sieht alles ein bisschen hacky - modal windows für die Anmeldung, proxy etc. Aber auch die Suche zu diesem Thema konnte ich nicht finden keine bessere und elegantere Weg, es zu tun. Ich denke, das ist immer noch ein Mangel, dass alle js-apps zu tun haben, wenn Sie möchten, eine token-basierte Authentifizierung.
Ihnen fehlt etwas mit der OAuth-Spezifikation. Die
client_id
undclient_secret
sind wirklich wichtig, wenn gefragt wird, für ein access-token bei Verwendung der Passwort-Methode von OAuth v2. In der Tat, Sie sind wichtig für jede Methode, die Ihnen ein Zugangs-token. Sie identifizieren die Anwendung oder der server, der die Anforderung durchzuführen.Zum Beispiel, sagen wir, Sie haben Ihre API 2 mobile Anwendungen und andere server, die einige Aufgaben mit Ihren API. Erstellen Sie 3 Kunden mit Ihren eigenen
client_id
undclient_secret
. Wenn Ihre Anwendung hat verschiedene Zugriffsebenen (man nennt Siescopes
im OAuth-v2), dieclient_id
entsprechenden auf den anderen server wird in der Lage sein, zum aufrufen von Funktionen der API, die erfordern, dass der Umfangadmin
in der Erwägung, dass Ihre mobile Anwendung wird nur in der Lage sein, zum aufrufen von Funktionen der API, die erfordern, dassbasic
Umfang, wenn Sie definiert haben, Bereiche wie diese.Wenn Ihr API wächst in die Zukunft, das ist wirklich wichtig. Ein weiteres Beispiel, stellen Sie sich vor, Sie haben einen API-Schlüssel (ein paar
client_id
undclient_secret
) zu einem Ihrer Freund und er hat eine gute mobile app, die mit Ihren API. Wenn er eines Tages startet die freche Dinge tun, die mit Ihren API -, Sie können nicht aufhören, ihn sehr leicht. Während Sie haben könnte, den Sie gerade entfernt seinen key pair-Mädchen, wenn Sie gefolgt war-OAuth-v2-Prinzipien.OAuth v2 ist nicht eine einfache Sache zu verstehen, nehmen Sie sich die Zeit und Lesen Sie die Spezifikationen und die guten tutorials, bevor Sie mit der Entwicklung Ihrer API.
Einige nützliche links :
Nur um ein bisschen zu plunntic ausgezeichnete Antwort: denken Sie daran "client" ist nicht mit "user", also wenn ich mit einem Passwort flow ich einfach definieren, die client_id und client_secret als Konstanten auf der AngularJS-app zu sagen, die api backend: hey, das ist die browser-app, die verwendet wird, um die Anforderung, ein token.