3

小さなWebアプリケーションを開発しています。Google のソーシャル認証にhttps://pythonhosted.org/Flask-OAuthライブラリを使用しています。また、Flask-Login. 認証コールバックを正常にセットアップし、ユーザーを認証しました。を使用して、ユーザーも正常にログインできますlogin_user(user, remember=True)

remember_tokenこれにより、有効期限が 365 日のという名前の 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の仕事です。
  • ブラウザーを閉じて再度開くと、webapp を開かなくなるまで 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