8

मैं उपयोगकर्ताओं को एक अलग वेब सेवा से अपने खातों का उपयोग करके अपने फ्लास्क ऐप में लॉगिन करने की अनुमति देने की कोशिश कर रहा हूं। मैं इस वेब सेवा के एपीआई से संपर्क कर सकता हूं और एक सुरक्षा टोकन प्राप्त कर सकता हूं। उपयोगकर्ताओं को प्रमाणीकृत करने के लिए मैं इस टोकन का उपयोग कैसे करूं ताकि उनके पास प्रतिबंधित दृश्यों तक पहुंच हो?आप फ्लास्क में टोकन प्रमाणीकरण कैसे कार्यान्वित करते हैं?

मुझे उपयोगकर्ताओं को अपने डेटाबेस में सहेजने की आवश्यकता नहीं है। मैं केवल उन्हें एक सत्र के लिए प्रमाणित करना चाहता हूं। मेरा मानना ​​है कि यह फ्लास्क-सिक्योरिटी और @Auth_token_required सजावट का उपयोग करके किया जा सकता है लेकिन दस्तावेज़ीकरण बहुत विस्तृत नहीं है और मुझे यकीन नहीं है कि इसे कैसे कार्यान्वित किया जाए।

संपादित करें:

@main.route("/login", methods=["GET", "POST"]) 
def login(): 

    payload = {"User": "john", "Password": "password123"} 
    url = "http://webserviceexample/api/login" 
    headers = {'content-type': 'application/json'}) 

    #login to web service 
    r = requests.post(url, headers=headers, json=payload) 
    response = r.json() 

    if (r.status_code is 200): 
     token = response['user']['authentication_token'] 

     # allow user into protected view 

    return render_template("login.html", form=form) 


@main.route('/protected') 
@auth_token_required 
def protected(): 
    return render_template('protected.html') 
+0

आपको उपयोगकर्ताओं को टोकन के साथ स्टोर करने की आवश्यकता है; और सेवा के खिलाफ टोकन की वैधता की पुष्टि करें। अन्यथा जब भी वे शुरू करते हैं तो आपको तृतीय पक्ष सेवा के खिलाफ हर बार आगंतुकों को प्रमाणीकृत करना होगा। –

+0

हर बार जब आप प्रत्येक सत्र के लिए मतलब करते हैं? यदि ऐसा है, तो यह ठीक है कि उन्हें फिर से प्रमाणीकरण करना होगा। क्या कोई कारण यह एक मुद्दा होगा? – Amerikaner

उत्तर

11

अरे वहाँ Amedrikaner:

यहाँ एक कोड उदाहरण है!

ऐसा लगता है कि आपका उपयोग-मामला इतना आसान है कि हम इसे स्वयं लागू कर सकते हैं। नीचे दिए गए कोड में, मैं उपयोगकर्ता सत्र में अपना टोकन संग्रहीत कर रहा हूं और एक नए रैपर में जांच कर रहा हूं। आइए अपना खुद का रैपर बनाकर शुरू करें, मैं आमतौर पर इन्हें सिर्फ एक wrappers.py फ़ाइल में डालता हूं लेकिन क्या आप इसे कहां रख सकते हैं।

def require_api_token(func): 
    @wraps(func) 
    def check_token(*args, **kwargs): 
     # Check to see if it's in their session 
     if 'api_session_token' not in session: 
      # If it isn't return our access denied message (you can also return a redirect or render_template) 
      return Response("Access denied") 

     # Otherwise just send them where they wanted to go 
     return func(*args, **kwargs) 

    return check_token 

कूल!

अब हमारे पास हमारे रैपर को लागू किया गया है, हम केवल सत्र में अपना टोकन सहेज सकते हैं। सुपर सरल के अपने कार्य को संशोधित करते हैं ...

@main.route("/login", methods=["GET", "POST"]) 
def login(): 

    payload = {"User": "john", "Password": "password123"} 
    url = "http://webserviceexample/api/login" 
    headers = {'content-type': 'application/json'}) 

    #login to web service 
    r = requests.post(url, headers=headers, json=payload) 
    response = r.json() 

    if (r.status_code is 200): 
     token = response['user']['authentication_token'] 

     # Move the import to the top of your file! 
     from flask import session 

     # Put it in the session 
     session['api_session_token'] = token 

     # allow user into protected view 

    return render_template("login.html", form=form) 

अब आप संरक्षित विचारों @require_api_token आवरण का उपयोग कर, इस तरह की जाँच कर सकते हैं ...

@main.route('/super_secret') 
@require_api_token 
def super_secret(): 
    return "Sssshhh, this is a secret" 

संपादित ओह! मैं उल्लेख करना भूल गया कि आपको अपने ऐप्स कॉन्फ़िगरेशन में अपना SECRET_KEY सेट करने की आवश्यकता है।

SECRET_KEY = "SOME_RANDOM_STRING" के साथ बस एक config.py फ़ाइल करेगा। फिर इसे लोड करें ...

main.config.from_object(config) 
+0

यह वही है जो मैं खोज रहा था। धन्यवाद एफ Boucaut! – Amerikaner

+0

क्या हमें इन दो तत्वों की आवश्यकता है या डेटाबेस के विरुद्ध उपयोगकर्ता प्रमाण-पत्र सत्यापित करने के लिए कोई अन्य कार्य नहीं होना चाहिए? –

+0

@EvanBurbidge देर से उत्तर के लिए खेद है। यह कार्यान्वयन विशेष रूप से बाहरी एपीआई के खिलाफ उपयोगकर्ताओं को प्रमाणीकृत करने के लिए था। अधिकतर आप एक मानक उपयोगकर्ता लॉगिन प्रवाह का पालन करना चाहते हैं, अधिक लिंक के लिए इस लिंक को देखें https://flask-login.readthedocs.io/en/latest/ –

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