3

我正在开发一个小型 Web 应用程序。我正在使用https://pythonhosted.org/Flask-OAuth库进行 Google 的社交身份验证。另外,Flask-Login. 我已成功设置授权回调并授权用户。我也可以使用login_user(user, remember=True).

这将创建一个名为remember_token365 天到期的 cookie。但是,当我关闭浏览器(Firefox、Chrome)和重新打开我的应用程序时,就会出现问题。

在 Firefox 中使用Tools->Privacy->Remove Individual Cookies,我可以看到 remember_token cookie。但是,当我导航到索引页面/时,我已经设置了这个功能..

@main.route('/', methods=['GET', 'POST'])
def index():
    if current_user.is_authenticated:
        print_debug('User is authenticated in /')
        return redirect(url_for('.home'))
    else:
        return render_template('index.html')

@main.route('/home', methods=['GET', 'POST'])
@login_required
def home():
    do_something()

导航到/打印调试信息并成功重定向到/home发生。但是,此重定向被拦截@login_required,我被重定向到/google-login?next=%2Fhome要求我再次登录。此外,remember_token在此阶段也将其删除。我在 Firefox 中检查后确认。

我不明白为什么记住功能不能正常工作。或者为什么remember_token要删除。中间我什么都不做。循序渐进,

  • 我最初登录。直到浏览器没有关闭,一切正常。所有@login_required的工作。
  • 当我关闭浏览器并重新打开时,直到我没有打开我的网络应用程序, localhost:5000仍然有一个 cookie names remember_token
  • 一旦我打开,第一个current_user.is_authenticatedon/返回 True,从此时开始,每个 @login_required 都要求重新登录。

我正在使用 Flask-sqlalchemy 和 MySQL 作为数据库。我的用户模型是

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    password_hash = db.Column(db.String(128))
    username = db.Column(db.String(128), unique=True, index=True)

我的用户加载器

@login_manager.user_loader
def load_user(user_id):
    print_debug("User loader called with id %s" % user_id)
    return User.query.get(int(user_id))

任何帮助将非常感激。

谢谢!

4

0 回答 0