2016-07-25 19 views
2

フラスコサーバーにflask_loginを書きました。ユーザーにログインするには、私はlogin_user(user)を使用し、私は@login_requiredで保護された私のサイトの1ページを持っています。クライアントとして、私はPythonがパッケージを要求し使用し、それがコードです:PythonリクエストのFlaskサーバー上のセッションは動作しません

import requests 
sess = requests.session() 
sess.post("http://page.on/my/site", data={"login" : "login", "password" : "password"}) 

すべては、この認証でOKですが、その後、私は保護されたページにアクセスしよう:

r = sess.get("http://secure.page/on/the/site") 

そして、この要求は、Unauthorizedを受け取ります。認証(今のところ、私はローカルホスト上の私のサーバーを持っている)後に設定 それのクッキー:この認証の問題を解決する方法

login_manager.session_protection = "strong" 

:ところで

<RequestsCookieJar[<Cookie session=.eJwdzjkSwjAMAMC_uE4h2dbhfCZjHR5oE1Ix_B2Gbst9l2OdeT3K_jrv3MrxjLKX5tqBGbq7MfmPiYi8aA7RAG8haZJoDZ0HrlSG6Oa1-yCqsaJNJlSVAQToNXsAt8UiFQBIbIa3bmYiarYyiEaNsUJjmlLZyn3l-c_Uzxf_2C6a.Cnf0yA.xIUSIFgcvjqwszrbwCA_D2Rqa5k for localhost.local/>]> 

は、私はまた、これを使用しますか?

UPD:

サーバーのログインコードです:

@api.route("/login/", methods=["POST"]) 
def handle_login_request(): 
    login, password = str(request.form['login']).lower(), str(request.form['password']) 
    # Get and check user here 
    login_user(user) 
    # update user and get user_data 
    return jsonify(user_data) 

担保ルート:

@api.route("/users_of_group/") 
@login_required 
def get_user_of_users_group(): 
    # code here never executes because of @login_required 

apiがフラスコの青写真の名前です

UPD2:

sess.getによって返されたページの内容です

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 
<title>401 Unauthorized</title> 
<h1>Unauthorized</h1> 
<p>The server could not verify that you are authorized to access the URL requested. You either supplied the wrong credentials (e.g. a bad password), or your browser doesn't understand how to supply the credentials required.</p> 

UPD3:最初のユーザーに正常にログインしていることを、私が見ることができるサーバで

r = sess.get("http://secure.page/on/the/site", auth=("login", "password")) 

、しかし: 私はこれを使用しようとしましたサーバーはとにかく401をスローします。

import requests 
sess = requests.session() 
login = sess.post("http://page.on/my/site", data={"login" : "login", "password" : "password"}) 
r = sess.get("http://secure.page/on/the/site", cookies=login.cookies) 

また、ユーザーがログインしてから401

UPD4スロー:

問題をLOGIN_USER機能にあるように見える、それはTrueis_authenticatedは変更されません。私はSQLAlchemyのを使用して、これは私のユーザークラスです:

class User(db.Model): 
    user_id = db.Column(db.Integer, primary_key=True) 
    # Many required for my app fields 
    is_active = db.Column(db.Boolean, default=False) 
    is_authenticated = db.Column(db.Boolean, default=False) 
    is_anonymous = db.Column(db.Boolean, default=False) 
    is_online = db.Column(db.Boolean, default=False) 

    # Init function 

    def get_id(self): 
     return str(self.user_id) 

そしてuser_loader

@login_manager.user_loader 
def load_user(user_id): 
    print(user_id, type(user_id)) 
    user = User.query.filter_by(user_id=int(user_id)).first() 
    print(user.login, user.is_authenticated) 
    return user 

IDは、正しく印刷され、その種類はstrで、クエリがうまく動作しますが、私はまだUnauthenticatedエラーを取得しており、最後にprintuser.is_authenticatedはFalseです。

UPD5:

は実際には、ちょうどlogin_useruser.is_authenticatedを印刷することも、私はlogin_usersession.commit()と呼ばれるにもかかわらず、Falseを示しています。

+0

ドキュメントによると、セッション保護はアクティブで、各要求は、ユーザーのコンピュータの識別子(基本的に、IPアドレスとユーザーエージェントの安全なハッシュ)を生成します。それはまったく問題であるように見えます。完全な[mcve]を投稿できますか? –

+0

@WayneWerner、私の更新された回答を参照してください –

+0

質問からユーザーローダーとユーザークラスが欠落していますが、私の答えがあなたの問題を解決する可能性があります。 –

答えて

0

これは説明の挙動を示すように表示されます。

from flask import Flask, request 
from flask_login import LoginManager, UserMixin, login_user, login_required, \ 
         current_user 

app = Flask(__name__) 
app.secret_key = 'This is totally a secret' 
login_manager = LoginManager() 
login_manager.init_app(app) 
login_manager.session_protection = 'strong' 


class User(UserMixin): 
    id = 42 

    @property 
    def is_authenticated(self): 
     print('{!r}'.format(self.id)) 
     return self.id == 42 


@login_manager.user_loader 
def get_user(id): 
    user = User() 
    user.id = id 
    return user 


@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    if request.method == 'POST': 
     user = User() 
     user.id = request.form.get('id', 42) 
     login_user(user) 
    else: 
     user = current_user 
    return 'Okay, logged in with id {}'.format(user.id) 


@app.route('/') 
@login_required 
def main(): 
    return 'Hey cool - your id {}'.format(current_user.id) 



if __name__ == '__main__': 
    app.run(host='0.0.0.0', port=5001, debug=True) 

何ここで注意すべきことはIDが'42'、ない42であるということです。明らかにセッションからIDをデコードすることは、あなたのIDが文字列以外のものであることを知るには十分巧妙ではありません。私の機能をreturn str(self.id) == '42'に変更することで動作します。私はあなたのユーザーローダーまたはユーザークラスに同様の設定があると思われます。

あなたのユーザーモデルでは、間違ったis_authenticatedが生成されている可能性があります。もちろん、を正確にに伝えている可能性が高いです。認証されたビットを修正するだけで済みます。ユーザーローダーから匿名ユーザーを使用するNoneを返す場合は、をis_authenticatedメソッドでハードコードすることができます(セッション間でユーザーをログアウトしようとしている場合を除きます)。

+1

'Flask-Login' *はあなたのユーザIDをテキストタイプ(2.7では' unicode'、3.xでは 'str')にする必要があります。 ['get_id'](https://flask-login.readthedocs.io/en/latest/#your-user-class)のドキュメントを参照してください。まあ、厳密に言うと、 'get_id'をオーバーライドして変換を行うことができますが、' get_id'はテキスト型を返す必要があります。 – jpmc26

+0

知っておいて便利です - 私は 'UserMixin'が' get_id'の裏でそれをしていると思います。 –

+0

@WayneWerner、私はちょうどこれを試して、いくつかのデバッグプリントを追加しました。問題は全く異なります。私の更新された答えを参照してください。 –

関連する問題