我正在尝试构建一个简单的原型,该原型将具有登录/密码身份验证和OAuth2身份验证,后者使用Flask-Dance。那么,将current_user.is_authenticated
与facebook.authorized
相结合的最佳实践是什么?
我正在努力编写登录和注销的正确逻辑。到目前为止,我的代码如下所示:
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('index'))
@app.route("/")
def index():
if current_user.is_authenticated and facebook.authorized: # here is the problem
me = facebook.get('me?fields=id,first_name,email').json()
social_id, username, email = me['id'], me['first_name'], me['email']
user = User.query.filter_by(social_id=social_id).first()
if not user:
user = User(social_id=social_id, nickname=username, email=email)
db.session.add(user)
db.session.commit()
login_user(user, True)
return render_template('index.html')
如您所见,一旦用户注销,她就无法重新登录。但是,如果我从if
中删除current_user.is_authenticated
,那么即使用户单击注销链接,她也会保持登录状态。
我认为 index
函数不是处理 Facebook 登录的合适位置,我应该以某种方式挂钩执行 OAuth 舞蹈的实际方法,但我需要有关如何执行此操作的提示,而无需投入修改 Flask-Dance 代码......
我是Flask-Dance的作者。查看多用户设置的文档,查看如何在用户登录过程中挂接到此oauth_authorized
信号的示例。
在 GitHub 上提出问题后,我将在此处发布作者的回应:
你和我都无法控制Facebook选择如何实现OAuth,如果用户在授权步骤中单击"取消",它可能会选择给你一个没有权限的OAuth令牌。您可以使用
oauth_authorized
信号进行检查,如下所述:http://flask-dance.readthedocs.io/en/latest/signals.html