2013-07-25 11 views
26

में एंडपॉइंट के रूप में प्लग करें मैं सामाजिक लॉग इन के लिए अपनी वेबसाइट पर django-allauth का उपयोग कर रहा हूं। मेरे पास डीजेंगो-रेस्ट-फ्रेमवर्क द्वारा संचालित एक आरईएसटी एपीआई भी है जो मोबाइल ऐप के बैकएंड के रूप में कार्य करती है। क्या कोई तरीका है कि मैं सीधे एएसयूथ के प्रमाणीकरण बैकएंड को आरईएसटी एपीआई में प्लग कर सकता हूं ताकि मैं मोबाइल ऐप में फेसबुक लॉगिन का उपयोग करने वाले उपयोगकर्ताओं को मान्य (और पंजीकृत) कर सकूं?django-allauth में django-rest-framework

स्पष्टीकरण के लिए: फेसबुक लॉगिन भाग देशी एसडीके द्वारा संभाला जाता है। मुझे एक एंडपॉइंट की आवश्यकता है जो POST /user (यानी, एक नया उपयोगकर्ता बनाता है) की तरह काम करता है, लेकिन फेसबुक ओथ टोकन ईमेल/पासवर्ड इत्यादि के बजाय इनपुट के रूप में लेता है

+0

django-oauth-toolkit और पायथन-सोशल-ऑथ का उपयोग करके [oauth2 टोकन प्रमाणीकरण के संभावित डुप्लिकेट] (http://stackoverflow.com/questions/27051209/oauth2-token-authentication-using-django-oauth-toolkit- और-अजगर-सामाजिक लेखन) –

उत्तर

2

जबकि मुझे पूरा यकीन नहीं है कि कैसे allauth और rest- एक साथ fremework, allauth does not offer such an endpoint

सुझाव:
कॉल allauth.socialaccount.providers.facebook.views.fb_complete_login (कोई नहीं, socialtoken) जहां socialtoken login_by_token में बनाया है: अपने स्वयं के निम्न में से एक बदलाव करता है बनाते हैं। यह एक django.contrib.auth.login, संभवतः एक्ट बनाते हुए (कुछ कार्यों को गहरा करता है) करता है।

उसके बाद, मोबाइल उपकरणों पर इस्तेमाल के लिए, यह संभव प्राधिकरण (नहीं अमेरिकन प्लान) टोकन के लिए हो सकता है: उपयोगकर्ता डेटा मिलता है, और

rest_framework.authtoken.views.obtain_auth_token फोन (सत्र से?) नोट्स:
1. यह ईमेल विवादों को हल करने या सामाजिक/स्थानीय एक्ट्स को जोड़ने का कोई तरीका नहीं प्रदान करता है।
2. मैंने कोशिश नहीं की है - अगर आप इसे काम कर सकते हैं तो कृपया कोड पोस्ट करें।

9

आप सामाजिक प्रमाणीकरण django-rest-framework-social-oauth2 के लिए इस libray उपयोग कर सकते हैं। इस 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', 
      }) 
0

आप इस के लिए Django Rest Auth उपयोग कर सकते हैं जिस पर निर्भर करता है Django-allauth। एकीकृत करना बहुत आसान है।

संबंधित मुद्दे