8

Kullanıcıların hesaplarını ayrı bir web servisinden kullanarak Flask uygulamasına giriş yapmasına izin vermeye çalışıyorum. Bu web servisinin iletişim bilgilerine ulaşabilir ve güvenlik belirteci alabilirim. Kullanıcıların kimliklerini doğrulamak için bu belirteci nasıl kullanırım?Flask'ta jeton kimlik doğrulamasını nasıl uygularsınız?

Kullanıcıları kendi veritabanına kaydetmem gerekmiyor. Sadece bir oturum için onları doğrulamak istiyorum. Bunun Flask-Security ve @auth_token_required dekoratör kullanılarak yapılabileceğine inanıyorum, ancak belgeler çok ayrıntılı değil ve nasıl uygulanacağından emin değilim.

DÜZENLEME: Orada

@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

Kullanıcıları belirteci ile kaydetmeniz gerekir; ve belirtecin hizmete karşı geçerliğini doğrulayın. Aksi takdirde, her seferinde ziyaretçilere her defasında 3. taraf hizmetine karşı kimlik doğrulaması yapmanız gerekecektir. –

+0

Her oturumda her oturum için mi demek istiyorsunuz? Eğer öyleyse, yeniden kimlik doğrulaması yapmaları iyi olur. Bunun bir sorun olması için bir sebep var mı? – Amerikaner

cevap

11

Hey Amedrikaner:

İşte bir kod örneği!

Kullanım durumunuz, kendimizi uygulayabileceğimiz kadar basit görünüyor. Aşağıdaki kodda, kullanıcı oturumunda belirteçinizi saklayacağım ve yeni bir sarıcıyı kontrol edeceğim. Kendi sarmalayıcımızı yaparak başlayalım, genellikle bunları bir wrappers.py dosyasına koyarım ancak istediğiniz yere yerleştirebilirsiniz.

( )

Artık sargımızı uyguladıktan sonra jetonunu sadece seansa kaydedebiliriz. Süper basit. ...

@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) 

Şimdi böyle, @require_api_token sarmalayıcı kullanarak korumalı görünümleri kontrol edebilirsiniz ... senin işlevini değiştirmek Let

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

DÜZENLEME Whoahh! SECRET_KEY'inizi uygulama yapılandırmanızda ayarlamanız gerektiğini belirtmeyi unuttum.

Sadece SECRET_KEY = "SOME_RANDOM_STRING" olan bir config.py dosyası yapılacaktır. Daha sonra yükleyiniz ...

main.config.from_object(config) 
+0

Bu tam olarak aradığım şey. Teşekkürler F Boucaut! – Amerikaner

+0

Bu iki öğeye ihtiyacımız var mı yoksa kullanıcı kimlik bilgilerini veritabanına karşı doğrulamak için başka bir işlev olmamalı mı? –

+0

@EvanBurbidge Geç cevap için özür dilerim. Bu uygulama, kullanıcıları başka bir yerde harici bir API'ye karşı doğrulamak için özel olarak kullanıldı. En çok standart kullanıcı giriş akışını takip etmek istediğiniz gibi, daha fazla https://flask-login.readthedocs.io/en/latest/ –