0

ich nicht in der Lage bin meinen sozialen Benutzer mit django.I zu verknüpfen erstellt eine CreateAPIView das tut work.But do_auth genau
create-Methode token_access, token_access_secret und Anbieter von users.But scheint alles nimmt meine Benutzerkonto.django sozialer Auth mit django Rest Rahmen

views.py 
class SocialSignUp(CreateAPIView): 
# permission_classes =() 
queryset = User.objects.all() 
serializer_class = SocialUserRegistrationSerializer 
# social_serializer = SocialUserRegistrationSerializer 
ee = None 

def create(self, request, *args, **kwargs): 

    prov = request.DATA['provider'] 
    redirect = request.path 
    if request.user.is_authenticated(): 
     authed_user = request.user 
    else: 
     authed_user = AnonymousUser() 

    backend = get_backend(name=prov, request=request, redirect=redirect) 
    serializer = self.serializer_class(data=request.QUERY_PARAMS) 
    if isinstance(backend, BaseOAuth): 
     print 'BaseOAUTH 1' 
     # Twitter, for example, uses OAuth1 and requires that you also pass 
     # an `oauth_token_secret` with your authentication request 
     token = { 
      'oauth_token': request.DATA['access_token'], 
      'oauth_token_secret': request.DATA['access_token_secret'], 
     } 

    elif isinstance(backend, BaseOAuth2): 
     # We're using oauth's implicit grant type (usually used for web and mobile 
     # applications), so all we have to pass here is an access_token 
     print 'BaseOAUTH 2' 
     token = request.DATA['access_token'] 
    print backend.user_data(request.DATA['access_token']) 
    print backend.get_scope() 
    try: 
     # if `authed_user` is None, python-social-auth will make a new user, 
     # else this social account will be associated with the user you pass in 
     user = backend.do_auth(access_token=token,) 
     print user 
    except AuthAlreadyAssociated: 
     # You can't associate a social account with more than user 
     return Response({"errors": "That social media account is already in use"}, 
         status=status.HTTP_400_BAD_REQUEST) 

    if user and user.is_active: 
     # if the access token was set to an empty string, then save the access token 
     # from the request 
     auth_created = user.social_auth.get(provider=prov) 
     if not auth_created.extra_data['access_token']: 
      # Facebook for example will return the access_token in its response to you. 
      # This access_token is then saved for your future use. However, others 
      # e.g., Instagram do not respond with the access_token that you just 
      # provided. We save it here so it can be used to make subsequent calls. 
      auth_created.extra_data['access_token'] = token 
      auth_created.save() 

     # Set instance since we are not calling `serializer.save()` 
     serializer.instance = user 
     headers = self.get_success_headers(serializer.data) 
     return Response(serializer.data, status=status.HTTP_201_CREATED, 
         headers=headers) 
    else: 
     return Response({"errors": "Error with social authentication"}, 
         status=status.HTTP_400_BAD_REQUEST) 

meine Serializer Klasse

class SocialUserRegistrationSerializer(serializers.Serializer): 
    """ 
    Serializer to receive social auth for python-social-auth 
    """ 
    access_token = serializers.CharField() 
    access_token_secret = serializers.CharField(required=False) 
    provider = serializers.CharField() 

eine andere imlementation:

def create(self, request, *args, **kwargs): 


    prov = request.DATA['provider'] 
    redirect = request.path 
    backend = get_backend(name=prov, request=request, redirect=redirect) 
    request.social_auth_backend = backend 
    access_token = request.DATA['access_token'] 

    if hasattr(request, 'user'): 
     if request.user.is_authenticated(): 
      user = request.user 
     else: 
      user = None 
    user = None 

    try: 
     if prov == "google-oauth2": 
      test_response = googleapis_profile(GOOGLEAPIS_PROFILE, access_token) 

      # gender = test_response.get('gender') 
      # email = test_response.get('email') 
      # full_name = test_response.get('familly_name') + test_response.get('given_name') 

      if test_response is None: 
       return Response({'success': False, 'detail': "bad access_token"}, status=status.HTTP_400_BAD_REQUEST) 


      user = backend.do_auth(access_token, user=user) 

      print user 
      my_user = user 
      user_serializer = SocialUserRegistrationSerializer(user) 
      return Response({'success': True, 'detail': user_serializer.data}) 
    except Exception as e: 
      return Response({'success': False, 'detail': e}, status = status.HTTP_400_BAD_REQUEST) 

Ich weiß nicht, nicht, wie zu machen do_auth funktioniert, ist es zurückgeben Benutzer als Nicht immer

Dank.

Antwort

0

django-social-auth wurde zugunsten python-social-auth veraltet. Ich denke, Sie würden gut bedient, um zu wechseln und versuchen, die umfangreiche Dokumentation für dieses Projekt zu verwenden.

+0

Ja, ich weiß das, aber das Problem ist, dass ich gezwungen bin, das gesamte Projekt zu aktualisieren. Ich benutze Django 1.5 und viele Drittanbieter. – TheGreenGoblen

+0

Ah, das macht immer Spaß. Ich bin mir sicher, dass Sie sich dessen bereits bewusst sind, aber Django 1.5 (und auch 1.6) werden als nicht unterstützt und möglicherweise unsicher angesehen. Entschuldigung, ich konnte nicht mehr in deinem Fall helfen :) – seawolf

+0

Wie auch immer, danke für deine Zeit. – TheGreenGoblen