2014-11-24 36 views
2

我創建與燒瓶登錄燒瓶服務器這樣的:如何使瓶記住一個登錄會話

登錄作品(它打印正確的用戶)。在此之後,我做了一個測試請求。 它總是每次都返回一個匿名用戶和一個不同的用戶(期待看到剛剛登錄的用戶)。

這些請求是由http服務器上的html頁面在同一個(本地)ip上創建的,但是與flask服務器不同。

這是我的Python文件,使用crossdomainflask

from flask import * 
from flask.ext.login import (LoginManager, UserMixin, login_user, current_user) 
from crossdomainflask import * 

class User(UserMixin): 
    def __init__(self, username): 
     self.name = username 

    @property 
    def id(self): 
     return self.name 

class FlaskServer(object): 
    def __init__(self): 
     self.login_manager = LoginManager() 
     self.server = Flask(__name__) 
     self.server.secret_key = '123456'  
     self.server.config.update(PROPAGATE_EXCEPTIONS = True) 
     self.login_manager.init_app(self.server) 

     @self.login_manager.user_loader 
     def load_user(userid): 
      return User("test") 

     @self.server.route('/api/login', methods=['POST']) 
     @crossdomain(origin='*') 
     def login(): 
      user = load_user(request.values.get('username')) 
      if user: 
       login_user(user) 
       print(current_user) 
       print(current_user.name) 
       return 'ok' 

     @self.server.route("/api/test", methods=['POST', 'GET'])   
     @crossdomain(origin='*') 
     def test(): 
      print(current_user) 
      return 'ok' 

     self.server.run("0.0.0.0") 
server = FlaskServer() 
+3

不要使用md5來「加密」密碼。不要允許跨域登錄。不要讓登錄與獲取... – 2014-11-24 19:14:47

+0

剛剛粘貼了一個可運行的Python腳本。 – Toast 2014-11-24 21:03:04

回答

-2

燒瓶登錄似乎不與crossdomainflask一起使用。 通過使用同一燒瓶服務器提供靜態文件來解決此問題。

+0

我現在有一個沒有跨域的工作解決方案。爲什麼在一臺服務器上的網站在另一臺服務器上使用API​​是一個糟糕的主意? – Toast 2014-11-29 17:00:38

+0

這不是這是什麼。 API通常會使用KEY,這就像一個非常長時間運行的會話密鑰;你首先不會有這個問題。 – godDLL 2014-12-05 15:39:04

13

如果read the docs for Flask-Login,你會發現你需要定義重新加載在後續請求用戶他們在登錄後,用戶裝載機

@login_manager.user_loader 
def user_loader(id): 
    # do whatever you need to to load the user object 
    # a database query, for example 
    user = MyUser.query.get(id) 
    return user 

問題可能還在於crossdomain不能正確使用由Flask-Login設置的登錄Cookie。您可能需要更改Cookie的域名或其他安全功能才能允許這樣做。但是,這不是允許從其他網站登錄的正確方法。


的事情你錯了已經發布的代碼很多。在繼續之前,您應該認真考慮退後一步,閱讀更多教程,並更好地理解安全性和Flask。

不需要服務器類,Flask中的所有模式都可以在模塊級別工作。所有狀態都可以保存在應用程序及其配置中,並用current_app代理。

發展服務器(app.run())僅用於地方發展。如果要部署在生產,使用真正的應用服務器,比如uWSGIGunicorn,和一個真正的web服務器,例如NginxApache。它們比開發服務器提供更多的性能和安全優勢。

暴露一個API並不壞,但直接公開登錄是不好的。您設置它的方式,遠程站點必須收集併發送憑證。考慮設置OAuth提供程序,以便只有您的站點處理憑據。 Stack Exchange API提供了這個工作流程的一個很好的例子,並且有各種各樣的Flask擴展,例如Flask-OAuthlib,實現這個。

你不應該用哈希MD5密碼,它現在已經有十年令人難以置信的不安。使用真正的散列實現,例如PBKDF2,BCrypt或SCrypt。 Passlib爲這些算法提供了卓越的接口,並且隨着時間的推移能夠升級哈希。

+0

我確實有一個用戶加載程序並將其添加到問題中。至於其他缺陷,這很快就被黑了,看看燒瓶登錄的工作,一旦它的工作,我會愉快地實施你建議的每一個改進。 – Toast 2014-11-24 20:12:37

+0

因爲我現在有一個工作解決方案,所以我從你的答案中解決了問題。爲什麼服務器不應該有它自己的類?我如何從我自己的網絡wihtout(0.0.0.0)以外的地方訪問它?線程有什麼問題?否則我的項目不起作用。 – Toast 2014-11-29 17:02:43

+0

你不想使用開發服務器,因爲它只存在於你自己的測試purpouse。除了所有的安全問題,這是不實際的,你必須像24小時重新啓動,因爲它不能處理更長的正常運行時間。沒有真正的緩存處理等等。相反,你想要綁定你的應用程序在像apache這樣的web服務器上。 – muthan 2014-12-04 15:21:47