please - laravel passport tutorial español
¿Cómo puedo administrar los tokens de actualización de OAuth con Laravel? (2)
Es difícil encontrar información para esto, en parte debido al paquete del servidor OAuth2 para que Laravel proporcione su propia solución OAuth, que es la mayoría de los resultados de búsqueda.
Creo que la mejor respuesta será escribir tu propio YoutubeProvider for Socialite. Aquí hay un tutorial: https://medium.com/laravel-news/adding-auth-providers-to-laravel-socialite-ca0335929e42#.6bn8i2wz4
Sería una molestia cambiar a Socialite para que empiece a trabajar con tokens de actualización, por lo que creo que la mejor ruta será que YoutubeProvider tenga una llamada adicional a una nueva función getRefreshToken al final de la función getAccessToken existente. Cambie los tokens de acceso y actualización para guardar el token recuperado en la base de datos, porque Socialite no le dará la opción de acceder al token de actualización para guardarlo en una clase de ayudante / controlador.
Cree un modelo de Tokens y una tabla de base de datos, y almacene los tokens de acceso y actualización allí con una relación con un modelo de Usuario.
Cuando escribe su ayudante de YoutubeService, tendrá que poder intentar una llamada API con un token de acceso y saber si desea actualizarlo con el token de actualización si recibe el mensaje de error de que ha caducado o no es válido.
La biblioteca API de Google para PHP parece manejar esto automáticamente con $client->setAccessType("offline")
: https://developers.google.com/api-client-library/php/auth/web-app
pero tan pronto como comiences a necesitar tokens de actualización para algo que no sea Google, escribirás ese código de todos modos si el nuevo proveedor tampoco tiene una biblioteca. Por el lado positivo, esta biblioteca tiene un Servicio específicamente para Youtube, por lo que debe manejar todas las llamadas API a Youtube que pueda necesitar. No estoy seguro de cómo usar esta biblioteca se relacionará con Socialite, ya que Socialite parece hacer mucho de lo que hace esta biblioteca. Podría terminar haciendo algún tipo de autorización redundante dentro de su clase YoutubeService a menos que realmente desee comenzar a personalizar cosas.
Podría valer la pena considerar eliminar Socialite de la ecuación por completo y usar la biblioteca de Google cuando se trata de sus servicios.
El complemento Socialiate proporciona una implementación para OAuth en Laravel, pero parece estar diseñado principalmente para permitir que no tengan que crear una cuenta de usuario en su propio sitio.
Estoy haciendo una aplicación que ayuda a administrar su cuenta de Youtube, lo que significa que el alcance de la solicitud de autenticación es más amplio (que era fácil de cambiar) pero también necesito un token de actualización (en lugar de solo un token de acceso) para acceder a su cuenta a largo plazo .
¿Hay algún paquete para Laravel que ya maneje esto? No he podido encontrar uno, pero tal vez estoy buscando algo equivocado.
Si no, ¿cómo debería abordar esto? Cuando escribo mi código que interactúa con la API de Youtube, simplemente necesito verificar si el token de acceso está vencido, y si es así, escribir una función que haga una solicitud HTTP para obtener una nueva con el token de actualización que he almacenado en el ¿base de datos? ¿Y supongo que extiendo Socialite para recuperar un token de actualización?
Siento que debe haber una manera mejor que no implique que reinvente la rueda.
Ha pasado un tiempo desde que se visitó por última vez esta pregunta y, dado que es el primer resultado de Google, me gustaría decir: esto ahora es posible con Socialite.
Cuando redirige a sus usuarios a Google, establezca access_type
para offline
con el método with()
al redireccionar, de esta manera:
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();
Esto hará que Google devuelva un token de actualización.