8

Das Plugin "Socialiate" stellt eine Implementierung für OAuth in Laravel bereit, aber es scheint hauptsächlich so konzipiert zu sein, dass es ihnen nicht erlaubt ist, ein Benutzerkonto auf Ihrer eigenen Website einzurichten.Wie kann ich OAuth-Aktualisierungstoken mit Laravel verwalten?

Ich mache eine Anwendung, die hilft, ihr Youtube-Konto zu verwalten, was bedeutet, dass der Umfang der Auth-Anfrage breiter ist (was leicht zu ändern war), aber ich brauche auch ein Refresh-Token (im Gegensatz zu einem Zugriffstoken) Zugang zu ihrem Konto.

Gibt es ein Paket für Laravel, das das schon erledigt? Ich konnte keinen finden, aber vielleicht suche ich nach dem Falschen.

Wenn nicht, wie soll ich das angehen? Wenn ich meinen Code schreibe, der mit der Youtube-API interagiert, muss ich einfach prüfen, ob das Zugriffstoken abgelaufen ist, und wenn ja, schreibe eine Funktion, die eine HTTP-Anfrage ausführt, um eine neue mit dem Aktualisierungs-Token zu erhalten Datenbank? Und ich denke, auch Socialite erweitern, um ein Refresh-Token zu erhalten?

Ich habe das Gefühl, dass es einen besseren Weg geben muss, der mich nicht dazu zwingt, das Rad neu zu erfinden.

Antwort

2

Dies ist schwierig zu finden, zum Teil wegen des OAuth2-Server-Pakets für Laravel, um eine eigene OAuth-Lösung bereitzustellen, die die meisten Suchergebnisse enthält.

Ich denke, die beste Antwort wird sein, Ihren eigenen YoutubeProvider für Socialite zu schreiben. Hier ist ein Tutorial: https://medium.com/laravel-news/adding-auth-providers-to-laravel-socialite-ca0335929e42#.6bn8i2wz4

Es wird ein Schmerz sein, Socialite zu ändern, um die Arbeit mit Refresh-Token zu starten, also denke ich, dass der beste Weg für den YoutubeProvider sein wird, einen zusätzlichen Aufruf einer neuen getRefreshToken-Funktion am Ende der vorhandene getAccessToken-Funktion. Ändern Sie sowohl die Zugriffs- als auch die Aktualisierungstoken, um das abgerufene Token in der Datenbank zu speichern, da Sie von Socialite nicht auf das Aktualisierungstoken zugreifen können, um es in einer Helper/Controller-Klasse zu speichern.

Erstellen Sie ein Token-Modell und eine Datenbanktabelle und speichern Sie dort sowohl Zugriffs- als auch Aktualisierungstoken mit einer Beziehung zu einem Benutzermodell.

Wenn Sie Ihren YoutubeService-Helper schreiben, muss er einen API-Aufruf mit einem Zugriffstoken versuchen und wissen, dass er mit dem Aktualisierungstoken aktualisiert wird, wenn er die Fehlermeldung erhalten hat, dass er abgelaufen/ungültig ist.

Die API-Bibliothek von Google für PHP scheint dies mit $client->setAccessType("offline") automatisch zu handhaben: https://developers.google.com/api-client-library/php/auth/web-app

aber sobald Sie Refresh-Token für etwas anderes als Google starten benötigen, werden Sie diesen Code sowieso zu schreiben, wenn der neue Anbieter hat auch keine Bibliothek. Auf der anderen Seite hat diese Bibliothek einen Service speziell für Youtube, also sollte sie alle API-Aufrufe an Youtube verarbeiten, die Sie benötigen. Ich bin mir nicht ganz sicher, wie die Verwendung dieser Bibliothek mit Socialite zusammenhängt, da Socialite bereits eine Menge von dem tut, was diese Bibliothek tut. Es kann passieren, dass Sie in Ihrer YoutubeService-Klasse eine Art redundanter Autorisierung vornehmen, es sei denn, Sie möchten wirklich mit der Anpassung von Dingen beginnen.

Es könnte sich lohnen, den Socialite vollständig aus der Gleichung zu entfernen und die Google-Bibliothek zu verwenden, wenn es um ihre Dienste geht.

14

Es ist eine Weile her, seit diese Frage zuletzt besucht wurde, und da es das erste Google-Ergebnis ist, würde ich gerne sagen: Dies ist jetzt mit Socialite möglich.

Wenn Sie Ihre Nutzer auf Google umleiten, stellen access_type-offline mit dem with() Methode, wenn Umleitung wie folgt aus:

return Socialite::driver('google') 
     ->scopes() // For any extra scopes you need, see https://developers.google.com/identity/protocols/googlescopes for a full list; alternatively use constants shipped with Google's PHP Client Library 
     ->with(["access_type" => "offline", "prompt" => "consent select_account"]) 
     ->redirect(); 

Dadurch wird Google eine Aktualisierungs-Token zurück.

+0

Dies sollte Top-Antwort tbh sein –

Verwandte Themen