Estoy tratando de crear una API de autenticación para una aplicación flutter que iniciará la sesión de los usuarios con un formulario de registro/inicio de sesión de autenticación de Google. Seguí este tutorial para lograr esto.
Hasta ahora todo bien, excepto que el tutorial se basa en un inicio de sesión de GitHub en lugar de Google. Logré que funcionara hasta el paso "conectar". Puedo obtener el code de la redirección, pero cuando accedo a http://127.0.0.1:8000/auth/google/ veo que solicita dos campos ( access_token , code ). Cuando intento simplemente publicar con la información que tengo, aparece el siguiente error:
"non_field_errors": [ "View is not defined, pass it as a context variable" ]Este es un error de conflicto de versión con djangorestframework => 3.12 Solución: Degradar a djangorestframework <= 3.11.0 y todo debería estar bien.
Prueba esto:
class GoogleLogin(SocialLoginView): adapter_class = GoogleOAuth2Adapter client_class = OAuth2Client serializer_class = SocialLoginSerializer def get_serializer(self, *args, **kwargs): serializer_class = self.get_serializer_class() kwargs['context'] = self.get_serializer_context() return serializer_class(*args, **kwargs) google_login = GoogleLogin.as_view()Quiero agregar detalles en el fragmento de código JACKSON MOURA con una explicación.
En settings.py, tienes que hacer esto. No encontré ninguna buena documentación. Pero funciona para la autenticación social. ahora ya no necesita configurar las aplicaciones de autenticación social usando el panel de administración. Mostré ejemplos de Google, Facebook y LinkedIn. También funcionará con otras aplicaciones sociales.
SOCIALACCOUNT_PROVIDERS = { "google": { "APP": { "client_id": "<client_id>", "secret": "<secret>", }, }, 'facebook': { "APP": { "client_id": "<client_id>", "secret": "<secret>", }, }, "linkedin": { "APP": { "client_id": "<client_id>", "secret": "<secret>", } } }Ahora en view.py, debe crear clases de serializador. todo será igual. Estoy mostrando para Google, LinkedIn y Facebook.
class FacebookLogin(SocialLoginView): adapter_class = FacebookOAuth2Adapter client_class = OAuth2Client serializer_class = SocialLoginSerializer def get_serializer(self, *args, **kwargs): serializer_class = self.get_serializer_class() kwargs['context'] = self.get_serializer_context() return serializer_class(*args, **kwargs) class GoogleLogin(SocialLoginView): adapter_class = GoogleOAuth2Adapter client_class = OAuth2Client serializer_class = SocialLoginSerializer def get_serializer(self, *args, **kwargs): serializer_class = self.get_serializer_class() kwargs['context'] = self.get_serializer_context() return serializer_class(*args, **kwargs) class LinkedInLogin(SocialLoginView): adapter_class = LinkedInOAuthAdapter client_class = OAuthClient serializer_class = SocialLoginSerializer def get_serializer(self, *args, **kwargs): serializer_class = self.get_serializer_class() kwargs['context'] = self.get_serializer_context() return serializer_class(*args, **kwargs)Ahora, el backend está listo para obtener datos de publicación desde el frontend y mostrará un error perfecto como se muestra a continuación. Funcionará con todas las demás aplicaciones sociales.
Es porque rest_auth ya no se mantiene y no es compatible con las últimas versiones de Django Rest Framework.
Este error se resuelve cambiando a dj-rest-auth en lugar de rest_auth, que se mantiene activamente como bifurcación del proyecto original.