2013-07-25 19 views
26

Używam django-allauth na mojej stronie do logowania w serwisach społecznościowych. Posiadam również interfejs REST API oparty na strukturze django-rest, który służy jako zaplecze aplikacji mobilnej. Czy istnieje sposób, w jaki mogę bezpośrednio podłączyć algorytm uwierzytelniania allauth do interfejsu API REST, aby móc weryfikować (i rejestrować) użytkowników, którzy korzystają z Facebooka w aplikacji mobilnej?Podłącz django-allauth jako punkt końcowy w django-rest-framework

Aby wyjaśnić: Część logowania na Facebooku jest obsługiwana przez natywne pakiety SDK. Potrzebuję punktu końcowego, który działa tak, jak POST /user (czyli tworzy nowego użytkownika), ale bierze tokena Facebooka jako dane wejściowe zamiast e-mail/hasło itp.

+0

możliwy duplikat uwierzytelnienia [oauth2 token za pomocą django-oauth-toolkit i python-social-auth] (http://stackoverflow.com/questions/27051209/oauth2-token-authentication-using-django-oauth-toolkit- i-python-social-auth) –

Odpowiedz

2

Chociaż nie jestem do końca pewien, jak używać allautha i odpoczynku fremework razem, allauth does not offer such an endpoint.

Sugestia: stworzyć własną odmianę, która robi z następujących czynności:
połączeń allauth.socialaccount.providers.facebook.views.fb_complete_login (None, socialtoken) gdzie socialtoken jest tworzony w login_by_token. Który wykonuje (kilka funkcji głębiej) django.contrib.auth.login, prawdopodobnie tworząc acct.

Po tym, do stosowania w urządzeniach mobilnych, może to być możliwe do auth (nie FB) token: uzyskać dane użytkownika i wywołać rest_framework.authtoken.views.obtain_auth_token

(od sesji?) Uwagi:
1. Nie ma możliwości rozwiązania konfliktów poczty e-mail lub połączenia elementów społecznościowych/lokalnych.
2. Nie próbowałem tego - proszę napisać kod, jeśli możesz go uruchomić.

9

Można użyć tej libray do uwierzytelnienia społecznego django-rest-framework-social-oauth2. Spróbuj tego Django allauth związanego kodu

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', 
      }) 
0

Można użyć Django Rest Auth do tego, który zależy od django-allauth. Bardzo łatwo się integruje.

Powiązane problemy