我正在尝试使用令牌来验证用户。
我已设法使用以下方法使用该流程:
@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
?
感谢您的帮助。
答案 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修饰函数:
...或者使用类似于本答案末尾代码的内容。
您无需亲自致电User.get_auth_token()
。当您致电login_user(user, remeber=True)
并定义了@login_manager.token_loader
查看LoginManager._set_cookie
和LoginManager._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')