Flask登录 - 未登录@ login_manager.token_loader

时间:2016-02-01 08:05:55

标签: python flask flask-login

我正在尝试使用令牌来验证用户。

我已设法使用以下方法使用该流程:

@login_manager.user_loader
def load_user(userid):
    from models import User
    return User.get(userid)

但是,在使用token时,我不知道如何使流程正常工作。

在我的views.py文件中,我有:

from flask import request, jsonify, url_for, render_template, session

@login_manager.token_loader
def load_token(token):

    # Check token and return user

当我登录用户时:

def _do_login_user(user):
    # User must have been authenticated
    if not user: raise_error('user does not exist', 'A user with this email address does not exist', 404)     

    # Check if user account is enabled
    if not user.is_active:
        raise_error('inactive account', 'Your account has not been enabled. Check your email Inbox and Spam folders for the confirmation email', 401)

    # Use Flask-Login to sign in user
    login_user(user)

    return json.dumps({"data":{"success":"true", "message":"You have logged in successfully!"}})

用户模型

class User(db.Model, UserMixin):

    def get_auth_token(self):
        s = Serializer(app.config['SECRET_KEY'], expires_in = 6000)
        return s.dumps({'id': self.id, 'password': self.password})

我应该在什么时候致电User.get_auth_token()并且我应该在session中手动设置此令牌吗?

最后何时调用@login_manager.token_loader

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我也没有时间尝试完成这项工作然后我放弃使用普通的user_loader,我唯一能建议的就是看看is defined as并查看实际的代码,从那个你看到它在会话中添加了user_id,因此您不必处理它。

无论如何,我花了很多时间试图让它发挥作用,最后我选择了与此类似的东西flask-login

update_attributes

不确定它有多大帮助,但是当你的耐心耗尽时,值得一读

答案 1 :(得分:0)

``@ login_manager.token_loader`就是关于"记住我"功能。

只有在浏览器访问您的网站而没有会话Cookie并且用户之前已使用login_user(user, remember=True)登录时,才会调用它。

您可以通过以下方式激发flask-login来调用token_loader修饰函数:

  • 使用'记住我'
  • 登录
  • 关闭浏览器
  • 再次打开浏览器并导航到“login_required”'页

...或者使用类似于本答案末尾代码的内容。

您无需亲自致电User.get_auth_token()。当您致电login_user(user, remeber=True)并定义了@login_manager.token_loader

时,Flask-login会调用它

查看LoginManager._set_cookieLoginManager._load_from_cookie,了解Flask-Login如何做到这一切。

您的_do_login_user函数会调用login_user而不会remember=True,因此这些都不会记住我"调用功能。

下面是一些代码,用于说明调用相关函数的时间:

from flask import Flask
from flask.ext.login import LoginManager, UserMixin, login_user, login_required

app = Flask('foo')
app.config['SECRET_KEY'] = 'abcd'
login_manager = LoginManager(app)


class User(UserMixin):
    def get_id(self):
        return 1

    def get_auth_token(self):
        print("get_auth_token called")
        return 'my_auth_token'


@login_manager.token_loader
def my_token_loader(token):
    print("my_token_loader called")
    return User()


@app.route('/login')
def login():
    login_user(User(), remember=True)
    return ''


@app.route('/protected')
@login_required
def protected():
    return ''


with app.test_client() as tc:
    # login will set session cookie as well as remember me cookie
    # User.get_auth_token will be called because we have defined a token_loader
    tc.get('/login')

    # clear the session cookie so the next request will use remember me
    tc.cookie_jar.clear_session_cookies()

    # our token_loader function should be called now as Flask-Login attempts to
    # log us in with the remember me cookie
    tc.get('/protected')