我正在尝试构建一个具有登录/密码身份验证和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')
正如您所看到的,一旦用户退出,她就无法重新登录。但是,如果我从current_user.is_authenticated
删除if
,则用户将保持登录状态甚至在她点击退出链接后。
我认为index
功能不是处理Facebook登录的正确位置,我应该以某种方式勾选OAuth舞蹈的实际方法,但我需要提示如何做这不需要修改Flask-Dance代码...
答案 0 :(得分:2)
我是Flask-Dance的作者。检查documentation for multi-user setups,以查看在用户登录过程中如何挂接到此oauth_authorized
信号的示例。
答案 1 :(得分:0)
在GitHub上提出问题后,我将在此处发布作者的回复:
您和我都无法控制Facebook选择如何实施OAuth,如果用户点击"取消"它可能会选择为您提供无权限的OAuth令牌。在授权步骤中。您可以使用
oauth_authorized
信号检查此信息,如下所示:http://flask-dance.readthedocs.io/en/latest/signals.html