2015-12-22 14 views
6

मैं Django-आराम-ढांचे का उपयोग कर मेरे Django REST API में Auth0 जेडब्ल्यूटी-आधारित प्रमाणीकरण लागू करने के लिए कोशिश कर रहा हूँ डिकोड करने के लिए। मुझे पता है कि आरईएसटी ढांचे के लिए एक जेडब्ल्यूटी लाइब्रेरी उपलब्ध है, और मैंने इसका उपयोग करने की कोशिश की है क्योंकि आधिकारिक औथ 0 ट्विटर अकाउंट ने उल्लेख किया है कि इसे एथ 0 + डीजेगो के साथ अच्छी तरह से काम करना चाहिए।Django + Auth0 जेडब्ल्यूटी प्रमाणीकरण मना

EDIT: मैं इस कोड के लिए the official auth0 python api guide का उपयोग कर रहा हूं। यह फ्लास्क के लिए लिखा गया है, लेकिन मुझे लगा कि मैं इसे डीजेगो को देखकर पोर्ट कर सकता हूं क्योंकि वे समान रूप से काम करते हैं।

अब, कि ऐसा नहीं हो पाया है कि कैसे मैं करना चाहता था, तो मैं एक दृश्य के लिए अपने खुद के login_required decorater लिखने की कोशिश कर रहा हूँ। कोड मैं यहाँ है निम्न प्रकार है:

def auth_required(f): 

    def wrap(request, *args, **kwargs): 
     auth = request.META.get('HTTP_AUTHORIZATION', None) 

     if not auth: 
      return authenticate({'code': 'authorization_header_missing', 'description': 'Authorization header is expected'}) 

     parts = auth.split() 

     if parts[0].lower() != 'bearer': 
      return authenticate({'code': 'invalid_header', 'description':  'Authorization header must start with Bearer'}) 
     elif len(parts) == 1: 
      return authenticate({'code': 'invalid_header', 'description':  'Token not found'}) 
     elif len(parts) > 2: 
      return authenticate({'code': 'invalid_header', 'description': 'Authorization header must be Bearer + \s + token'}) 

     token = parts[1] 
     try: 
      payload = jwt.decode(
       token, 
       base64.b64decode(SECRET.replace("_","/").replace("-","+")), 
       audience=CLIENT_ID, 
      ) 
     except jwt.ExpiredSignature: 
      return authenticate({'code': 'token_expired', 'description': 'token is expired'}) 
     except jwt.InvalidAudienceError: 
      return authenticate({'code': 'invalid_audience', 'description': 'incorrect audience, expected: ' + CLIENT_ID}) 
     except jwt.DecodeError: 
      return authenticate({'code': 'token_invalid_signature', 'description': 'token signature is invalid'}) 


     return f(request, *args, **kwargs) 

    wrap.__doc__=f.__doc__ 
    wrap.__name__=f.__name__ 

    return wrap 

अब, authenticate() जो अजगर एपीआई के लिए Auth0 के दस्तावेज में प्रयोग किया जाता है Jsonify() के लिए मूल रूप से अपने कस्टम कार्यान्वयन है। मैंने सत्यापित किया है कि यह काम करता है, इसलिए यह कोई समस्या नहीं है।

SECRET मेरी Auth0 गुप्त, बेस 64 में encoded है Auth0 दस्तावेज़ के अनुसार,
CLIENT_ID मेरी Auth0 ग्राहक आईडी जो दर्शक के रूप में प्रयोग किया जाता है (किसी अन्य कुंजी को डिकोड करने में विफल रहा है)।

मैं अग्रदूत पक्ष पर कोणीय बीज प्रोजेक्ट का उपयोग कर रहा हूं, और मैंने सत्यापित किया है कि टोकन वास्तव में अनुरोध के साथ भेजा जाता है, और मैंने सत्यापित किया है कि यह एक ही टोकन है जो token चर में संग्रहीत हो जाता है बैकएंड।

जब jwt.decode() कहा जाता है, यह jwt.DecodeError हर बार ट्रिगर किया जाएगा, और मैं इसे ठीक करने की कोशिश कर अनगिनत घंटे खर्च किया गया है, लेकिन मैं के रूप में पूरी तरह से दंग रह कर रहा हूँ क्यों इस नहीं काम कर रहे है। मैंने जेडब्ल्यूटी विकल्पों को झूठी, विशेष रूप से सत्यापित हस्ताक्षर को सेट करने की कोशिश की है। यह काम करता है, लेकिन मुझे लगता है कि जेडब्ल्यूटी हस्ताक्षर की पुष्टि को अक्षम करने के लिए यह असुरक्षित है।

मैं समझ नहीं क्यों यह मुझे विफल हो रहा है, मैं इसे एक डेकोरेटर में किया जा रहा बिना यह एक ही कोड की कोशिश की है और यह एक ही बात करता है। जो दृश्य सजाया गया है वह सिर्फ एक खाली दृश्य है जो एक ठीक HttpResponse देता है।

Tldr; Django-REST + Auth0 JWT का उपयोग करना - jwt.decode() कोई फर्क नहीं पड़ता कि मैं क्या करता हूं।

EDIT2: यह उल्लेखनीय है कि मैं corsheaders django-rest के लिए हूं जो मुझे क्रॉस-डोमेन अनुरोध करने की अनुमति देता है। मैंने JuthT लाइब्रेरी को अनइंस्टॉल करने और पुनर्स्थापित करने के लिए Auth0 से पायथन एपीआई मार्गदर्शिका के निचले हिस्से में टिप का भी पालन किया है, लेकिन यह मेरे लिए कुछ भी नहीं किया है।

मैं कुछ अनदेखी कर रहा हूँ, इसलिए ऐसा करना सादा असुरक्षित है या आप Django के साथ Auth0 लागू करने के लिए किसी भी बेहतर तरीका है? कृपया मुझे बताएं, यह समस्या मुझे दुःस्वप्न का कारण बन रही है।

+0

मैं duthango आराम ढांचे के साथ Auth0 का उपयोग करने की भी कोशिश कर रहा हूं। क्या आपके पास कोई स्रोत कोड है जिसे मैं देख सकता हूं? यदि आप कर सकते हैं, तो यह वास्तव में बहुत मदद करेगा! – nextdoordoc

+0

@nextdoordoc मुझे बहुत खेद है लेकिन मेरा कार्यान्वयन इतना टूटा हुआ था कि मैंने आधा रास्ते छोड़ दिया। आप किसी अन्य भाषा के लिए लिखे गए कार्यान्वयन को ढूंढने और इसे पोर्ट करने के लिए बेहतर प्रयास कर रहे हैं। –

+0

ओह यह सुनकर खेद है .. क्या आपने आखिरकार auth0 का उपयोग करने के लिए अन्य भाषा का उपयोग किया? या आप अंततः एक और प्रमाणीकरण उपकरण का उपयोग किया? – nextdoordoc

उत्तर

5

का एक क्लासिक मामले ...

मैं इसे doubleclicking, नहीं साकार द्वारा Auth0 डैशबोर्ड से गुप्त कुंजी की नकल की वहाँ भागों जो नहीं था थे "सबसे मुश्किल कीड़े तय करने के लिए आमतौर पर सबसे बेवकूफ होते हैं" कॉपी नहीं किया जाएगा। यह तय है।

यदि आप चाहते हैं, तो आप जेडब्ल्यूटी के सत्यापन के लिए अपने स्वयं के प्रोजेक्ट में अपने कस्टम सजावट का उपयोग कर सकते हैं।

आप इसे आयात और उसके बाद तो की तरह उपयोग:

@auth_required 
def myView(request): 
    .... 
+0

इसके बारे में क्षमा करें! यह उपयोगी प्रतिक्रिया है, हम Auth0 डैशबोर्ड में इस यूएक्स को बेहतर बनाएंगे। –

1

मैं अपने Django एपीआई पर auth0 करने के लिए इसी तरह के मुद्दों था, इसलिए मैं हाल ही में मुद्दों में से कुछ ठीक करने के लिए एक पैकेज बनाया: https://github.com/mcueto/djangorestframework-auth0

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