2016-03-29 75 views
1

我有一個燒瓶web應用程序,它有多個藍圖(restserver,webserver)。不同燒瓶藍圖的Differnet登錄視圖

webserver和restserver中的大多數端點都需要用戶登錄。我使用flask-login擴展,它提供了@login_required裝飾器。

是否有可能有不同的藍圖

# for web blueprint 
login_mananger.login_view = '/web/login' 

.. so on 
+0

也許,但是重定向到休息終端的登錄視圖沒有任何意義。如果用戶未通過身份驗證,則只會返回403。 – davidism

+0

是的。這正是我想要的。我如何確保僅爲web服務器藍圖執行login_manager.login_view ='/ web/login'。 – user462455

回答

0

一個REST風格的最重要的特色是無國籍,這意味着服務器將不會「記住」從客戶的任何信息,從不同的請求login_view客戶應該已經包含了所有需要的信息,包括認證信息。

回到您的問題,您不必使用Flask-Login進行REST式服務驗證,並且由於客戶端的多樣性,您不應使用Cookie或會話。你當然可以自己DIY HTTP認證,但Flask-HTTPAuth是你真正需要的。

這裏是瓶,HTTPAuth的一個最簡單的例子:

from flask.ext.httpauth import HTTPBasicAuth 
auth = HTTPBasicAuth() 

@auth.verify_password 
def verify_password(username, password): 
    user = User.query.filter_by(username=username).first() 
    if not user: 
     return False 
    g.current_user = user 
    # You should accomplish the verify_password function by yourself in the User model. 
    return user.verify_password(password) 

據燒瓶HTTPAuth商務部:

回調函數有兩個參數,用戶名和 密碼必須返回True或False。

你應該注意到的初始化燒瓶HTTPAuth只是在藍圖,而不是因爲這個認證只是在你的restserver藍圖使用的整個應用程序。

還有就像一個函數瓶登錄的@login_required它通過燒瓶HTTPAuth提供:

@app.route('/private') 
@auth.login_required 
def private_page(): 
    return "Only for authorized people!" 

當認證成功的這種「login_required」回調函數將被調用。由於所有restserver的路由都應該受到保護,因此可以使用「before_request」處理程序將保護應用於整個藍圖。假設你restserver藍圖的名字是「休息」,並已保存在「G」的用戶對象,就像我們做什麼之前:

from flask import jsonify 

@rest.before_request 
@auth.login_required 
def before_request(): 
    if not g.current_user: 
     return jsonify({'error':'Unauthorized.'}) 

我認爲這會做的伎倆。我上面寫的只是最簡單的例子,你可以用很多方式做得更好,比如在首次請求後用令牌替換用戶憑證。我相信你會弄明白的。

如果我的回答很有幫助,如果您可以爲此答案「upvote」,我將非常榮幸,謝謝。