2014-05-15 4 views
8

मैं की तरहमैं Django Rest Framework के साथ लॉगिन आराम API बनाने के लिए सत्र प्रमाणीकरण का उपयोग कैसे कर सकता हूं?

curl -X POST -d "username=myusername&password=mypassword" http://localhost:12345/rest/api-auth/login/ 

जो एक सत्र id कि मैं भविष्य अनुरोधों में उपयोग कर सकते हैं वापस आ जाएगी मेरी Django अनुप्रयोग के लिए लॉग इन करने के लिए (एक Android ऐप्लिकेशन से) सक्षम होने के लिए एक आराम एपीआई करने के लिए एक अनुरोध का उपयोग करना चाहते हैं। ऐसा लगता है कि मुझे सत्र प्रमाणीकरण प्रमाणीकरण योजना का उपयोग करना चाहिए, लेकिन इसके बारे में no doc है।

मुझे this question से अवगत है, लेकिन मैं किसी अन्य ऐप का उपयोग नहीं करना चाहता हूं।

कोई सुझाव/सूचक?

उत्तर

3

/api-auth/login/ संसाधन केवल ब्राउज़बल एपीआई में प्रमाणीकरण के लिए है। सत्र प्रमाणीकरण का उपयोग करने के लिए, आपको पहले एक सत्र बनाना होगा। आपके पास एक लॉगिन संसाधन होना चाहिए, जो उपयोगकर्ता प्रमाण-पत्र स्वीकार करता है और Django प्रमाणीकरण प्रणाली का उपयोग कर उपयोगकर्ता को प्रमाणित करता है। उस संसाधन का अनुरोध करने पर क्लाइंट एक कुकी हेडर होगा। एएमडी कुकी को आगे के अनुरोधों में उपयोग करना चाहिए।

curl -v -X POST https://example.com/api/user/login/ -d 'username=user&password=pass' 

... 

> Set-Cookie: csrftoken=TqIuhp8oEP9VY32tUDcfQyUwn3cqpYCa; expires=Fri, 15-May-2015 12:48:57 GMT; Max-Age=31449600; Path=/ 
> Set-Cookie: sessionid=4yb4s456lbvd974oijbdha7k3l6g52q3; expires=Fri, 30-May-2014 12:48:57 GMT; Max-Age=1209600; Path=/ 

डीआरएफ मूल प्रमाणीकरण का भी समर्थन करता है। आप इसे प्रारंभ में उपयोगकर्ता प्रमाणीकृत करने और सत्र बनाने के लिए उपयोग कर सकते हैं। यहाँ एक उदाहरण है:

from django.contrib.auth import login 

from rest_framework.authentication import BasicAuthentication, SessionAuthentication 
from rest_framework.permissions import IsAuthenticated 
from rest_framework.response import Response 
from rest_framework.views import APIView 


class MyBasicAuthentication(BasicAuthentication): 

    def authenticate(self, request): 
     user, _ = super(MyBasicAuthentication, self).authenticate(request) 
     login(request, user) 
     return user, _ 


class ExampleView(APIView): 
    authentication_classes = (SessionAuthentication, MyBasicAuthentication) 
    permission_classes = (IsAuthenticated,) 

    def get(self, request, format=None): 
     content = { 
      'user': unicode(request.user), 
      'auth': unicode(request.auth), # None 
     } 
     return Response(content) 
+0

तो मैं अपने एपीआई के लिए एक कस्टम दृश्य क्या करना है? Django रीस्ट ढांचे में ऐसी कोई चीज़ शामिल नहीं है? – jul

+0

धन्यवाद, लेकिन मैं इसका उपयोग कैसे कर सकता हूं? मैंने आपके कोड की प्रतिलिपि बनाई, 'url (r'^rest/login/$ ', views.ExampleView.as_view()), 'my urls.py पर जाएं और' कोई नहीं टाइप करें 'ऑब्जेक्ट' उपयोगकर्ता 'में नहीं है, _ = सुपर (MyBasic प्रमाणीकरण, स्वयं)। प्रमाणीकरण (अनुरोध) 'curl -i -X ​​POST की कोशिश करते समय http://127.0.0.1:8000/rest/login/ -d "उपयोगकर्ता = उपयोगकर्ता और पासवर्ड = पास" ' – jul

+0

आप उपयोग कर सकते हैं उस विशेष कार्यान्वयन को इस तरह से: 'curl -i -X ​​प्राप्त करें http://127.0.0.1:8000/rest/login/ -u उपयोगकर्ता: पास' इस ​​तरह आप बुनियादी प्रमाणीकरण का उपयोग कर कर्ल के साथ प्रमाणित करते हैं। – YAtOff

0

इरादा पोस्ट डेटा पर उपयोगकर्ता नाम & पासवर्ड पारित करके कुछ अंतबिंदु तक पहुँचने के लिए है, तो आप निम्न कर सकते हैं:

urls.py

urlpatterns = [ 
    url(r'^stuff/', views.MyView.as_view()), 
    ... 
] 

views.py

from django.contrib.auth.models import User 
    from rest_framework import viewsets 
    from rest_framework.response import Response 
    from rest_framework.views import APIView  
    from rest_framework.permissions import IsAuthenticated 
    from rest_framework import exceptions 
    from rest_framework import authentication 
    from django.contrib.auth import authenticate, get_user_model 
    from rest_framework.authentication import BasicAuthentication, 
SessionAuthentication 


class ExampleAuthentication(authentication.BaseAuthentication): 

    def authenticate(self, request): 

     # Get the username and password 
     username = request.data.get('username', None) 
     password = request.data.get('password', None) 

     if not username or not password: 
      raise exceptions.AuthenticationFailed(_('No credentials provided.')) 

     credentials = { 
      get_user_model().USERNAME_FIELD: username, 
      'password': password 
     } 

     user = authenticate(**credentials) 

     if user is None: 
      raise exceptions.AuthenticationFailed(_('Invalid username/password.')) 

     if not user.is_active: 
      raise exceptions.AuthenticationFailed(_('User inactive or deleted.')) 


    return (user, None) # authentication successful 


class MyView(APIView): 
    authentication_classes = (SessionAuthentication, ExampleAuthentication,) 
    permission_classes = (IsAuthenticated,) 

    def post(self, request, format=None):  
     content = { 
      'user': unicode(request.user), 
      'auth': unicode(request.auth), # None 
     } 
     return Response(content) 

कर्ल

curl -v -X POST http://localhost:8000/stuff/ -d 'username=my_username&password=my_password' 
संबंधित मुद्दे