2011-09-09 11 views
12

जब उपयोगकर्ता Django में प्रमाणित करता है, तो मैं इसे tastypie से कैसे देखूं?मैं उस उपयोगकर्ता को कैसे टेस्टपी से पहले से प्रमाणित कर सकता हूं?

एक बार जब उपयोगकर्ता लॉग ऑन करता है, तो दृश्य में कुछ जेएस शामिल होते हैं जो एपीआई से डेटा खींचते हैं, जिसे स्वादिष्ट द्वारा समर्थित किया जाता है।

मेरे पास मेरे संसाधनों पर मूल प्रमाणीकरण/djangoauthorisation स्थापित है, इसलिए ब्राउज़र http auth विंडो पॉप अप करता है। क्या इससे बचने का कोई तरीका है?

मेरा विचार अब तक मूल प्रमाणीकरण का विस्तार करना है ताकि यह पहले सत्र डेटा जांचता है और जब इसे नहीं मिलता है, तो यह http auth पर वापस आता है? AFAIK AJAX कॉल सत्र कुकीज़ शामिल हैं, तो सिद्धांत में यह काम करना चाहिए? क्या किसी ने कुछ ऐसा किया है?

class MyBasicAuthentication(BasicAuthentication): 
    def __init__(self, *args, **kwargs): 
     super(MyBasicAuthentication, self).__init__(*args, **kwargs) 

    def is_authenticated(self, request, **kwargs): 
     from django.contrib.sessions.models import Session 
     if 'sessionid' in request.COOKIES: 
      s = Session.objects.get(pk=request.COOKIES['sessionid']) 
      if '_auth_user_id' in s.get_decoded(): 
       u = User.objects.get(id=s.get_decoded()['_auth_user_id']) 
       request.user = u 
       return True 
     return super(MyBasicAuthentication, self).is_authenticated(request, **kwargs) 

जो मैं क्या चाहते हो रहा है:

उत्तर

10

मैं इस समाधान अब तक की है। यदि उपयोगकर्ता लॉग ऑन है, तो सत्र में _auth_user_id है, यदि नहीं, तो कुंजी गुम है।

कोई भी इस दृष्टिकोण के कारण किसी भी समस्या का विचार कर सकता है?

+0

यह हमारे लिए काम करता है, धन्यवाद! –

9

आप tastypie के GitHub पर इस टिकट की जाँच कर सकते हैं:

https://github.com/toastdriven/django-tastypie/issues/197

लेखक दोनों सत्र और एपीआई कुंजी के तरीकों के साथ कॉल प्रमाणित करने के लिए एक बहुत साफ दृष्टिकोण पता चलता है।

वहाँ चला जाता है टुकड़ा:

class ApiKeyPlusWebAuthentication(ApiKeyAuthentication): 
def is_authenticated(self, request, **kwargs): 
    if request.user.is_authenticated(): 
     return True 

    return super(ApiKeyPlusWebAuthentication, self).is_authenticated(request, **kwargs) 

def get_identifier(self, request): 
    if request.user.is_authenticated(): 
     return request.user.username 
    else: 
     return super(ApiKeyPlusWebAuthentication, self).get_identifier(request) 
0

Pulegium

क्यों बस के रूप में आसान नहीं के रूप में निम्नलिखित:

class CommAuthentication(BasicAuthentication): 
    def __init__(self, *args, **kwargs): 
     super(CommAuthentication, self).__init__(*args, **kwargs) 

    def is_authenticated(self, request, **kwargs): 
     return request.user.is_authenticated() 

मैं सिर्फ tastypie जानने के लिए शुरू करते हैं। उपरोक्त कोड मेरे लिए काम करता था। आपके समाधान का कोई फायदा?

+1

मुझे लगता है कि यह केवल तभी काम करेगा जब अनुरोध पहले ही प्रमाणित हो और सत्र कुकी सेट की गई हो। यदि आप HTTP बेसिक ऑथ हेडर सेट के साथ अनुरोध भेजते हैं तो यह असफल हो जाएगा, क्योंकि कोई सत्र नहीं है और आप सुपर क्लास 'is_authenticated' विधि को कॉल नहीं करते हैं, जो इस स्थिति को संभालने वाला है। – rytis

+0

धन्यवाद पुलेयियम। "मुझे लगता है कि यह केवल तभी काम करेगा जब अनुरोध पहले ही प्रमाणीकृत हो", क्या यह प्रोग्रामिंग से एपीआई तक पहुंचने के लिए इस तरह से काम करने की उम्मीद नहीं है? जहां तक ​​प्रमाणीकरण का सवाल है, सबसे अच्छा अभ्यास क्या है? वर्तमान में मेरे पास एक अलग लॉगिन एपीआई है जो उपयोगकर्ता को प्रमाणित करता है। केवल उपयोगकर्ता ने लॉगिन एपीआई सफलतापूर्वक पारित किया है अन्य आरामपूर्ण एपीआई का उपयोग कर सकते हैं। सुनिश्चित नहीं है कि यह अभ्यास ठीक है या नहीं। –

+0

बीटीडब्लू, मेरे लॉगिन एपीआई में मैंने सत्र-कुकी –

1

एक बार जब उपयोगकर्ता आपके एपीआई के माध्यम से लॉग इन हो जाता है, तो आपके पास Django उपयोगकर्ता सत्र होता है। यदि आप यह जांचना चाहते हैं कि उपयोगकर्ता अभी भी लॉग इन है (उदाहरण के लिए पेज रीफ्रेश पर)। आप कर सकते हैं:

from tastypie.resources import Resource 

class LoggedInResource(Resource): 
    class Meta: 
     pass 

    def get_list(self, request, **kwargs): 

     from django.http import HttpResponse 

     if request.user.is_authenticated(): 
      return HttpResponse(status=200) 
     else: 
      return HttpResponse(status=401) 

ग्राहक की जांच:

$.ajax({ 
    type: "GET", 
    url: '/api/loggedin/', 
    success: function(data) { 
     // logged in 
    }, 
    error: function() { 
     // not logged in 
    } 
}); 
संबंधित मुद्दे

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