python - Conecte django-allauth como punto final en django-rest-framework
(3)
Aunque no estoy muy seguro de cómo usar Allauth y rest-fremework juntos, Allauth no ofrece ese punto final .
Sugerencia: haga la suya que haga una variación de lo siguiente:
Llame a allauth.socialaccount.providers.facebook.views.fb_complete_login (None, socialtoken) donde socialtoken es como se creó en login_by_token. Eso realiza (algunas funciones más profundas) un django.contrib.auth.login, posiblemente creando el acct.
Después de eso, para usar en dispositivos móviles, podría ser posible usar el token auth (no FB): obtener los datos del usuario (¿desde la sesión?) Y llamar a rest_framework.authtoken.views.obtain_auth_token
Notas:
1. Esto no ofrece ninguna forma de resolver conflictos de correo electrónico o conectar actas sociales / locales.
2. No lo he intentado, por favor, publique el código si puede hacerlo funcionar.
Estoy usando django-allauth en mi sitio web para inicios de sesión sociales. También tengo una API REST con tecnología de django-rest-framework que funciona como backend de una aplicación móvil. ¿Hay alguna forma de que pueda conectar directamente el back-end de autenticación de Allauth a la API REST para que pueda validar (y registrar) a los usuarios que utilizan el inicio de sesión de Facebook en la aplicación móvil?
Para aclarar: la parte de inicio de sesión de Facebook es manejada por SDK nativos. Necesito un punto final que funcione como POST /user
(es decir, cree un nuevo usuario), pero toma Facebook oauth token como entrada en lugar de correo electrónico / contraseña, etc.
Podría usar djoser pero no sé cómo coopera con allauth: https://github.com/sunscrapers/djoser
Puede usar esta biblioteca para la autenticación social django-rest-framework-social-oauth2 . Prueba este código relacionado con django-allauth
urls.py
urlpatterns = [
url(
r''^rest/facebook-login/$'',
csrf_exempt(RestFacebookLogin.as_view()),
name=''rest-facebook-login''
),
]
serializers.py
class EverybodyCanAuthentication(SessionAuthentication):
def authenticate(self, request):
return None
views.py
class RestFacebookLogin(APIView):
"""
Login or register a user based on an authentication token coming
from Facebook.
Returns user data including session id.
"""
# this is a public api!!!
permission_classes = (AllowAny,)
authentication_classes = (EverybodyCanAuthentication,)
def dispatch(self, *args, **kwargs):
return super(RestFacebookLogin, self).dispatch(*args, **kwargs)
def get(self, request, *args, **kwargs):
try:
original_request = request._request
auth_token = request.GET.get(''auth_token'', '''')
# Find the token matching the passed Auth token
app = SocialApp.objects.get(provider=''facebook'')
fb_auth_token = SocialToken(app=app, token=auth_token)
# check token against facebook
login = fb_complete_login(original_request, app, fb_auth_token)
login.token = fb_auth_token
login.state = SocialLogin.state_from_request(original_request)
# add or update the user into users table
complete_social_login(original_request, login)
# Create or fetch the session id for this user
token, _ = Token.objects.get_or_create(user=original_request.user)
# if we get here we''ve succeeded
data = {
''username'': original_request.user.username,
''objectId'': original_request.user.pk,
''firstName'': original_request.user.first_name,
''lastName'': original_request.user.last_name,
''sessionToken'': token.key,
''email'': original_request.user.email,
}
return Response(
status=200,
data=data
)
except:
return Response(status=401, data={
''detail'': ''Bad Access Token'',
})