wtforms продолжает генерировать одни и те же токены для разных пользователей - PullRequest
0 голосов
/ 13 мая 2019

В моем приложении фляги я использую флеш-логин для управления входами и выходами пользователей.

Я уже добавил секретный ключ в мой файл конфигурации.Кроме того, я звоню {{login_form.csrf_token}} в начале формы.Однако, когда я пытался войти в систему с пользователем, иногда я получаю ошибку 400 (неверный запрос), которая не совпадает с жалобами на токены.После проверки поля csrf я понимаю, что оно всегда генерирует одни и те же несколько токенов.Чтобы уточнить сценарии, в которых я принимаю эту ошибку:

  • Когда пользователь-1 вошел в систему, если я попытался войти в систему с пользователем-2 и если форма генерирует тот же токен
  • Когда я вышел из системы с пользователем-1, и попытался повторно войти в систему с тем же пользователем, и если форма генерирует тот же самый токен

Я думаю, он каким-то образом не может определить токены, которые уже используются илитокены не освобождаются после выхода из системы.Я занимаюсь этой проблемой почти 2 дня и не могу понять, почему это происходит.Пожалуйста, помогите, ребята

маршрут входа

@bp.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        if current_user.has_role(['Super Admin', 'Admin']):
            return redirect(url_for('admin.admin_dash'))

        if current_user.has_role(['Gym']):
            return redirect(url_for('gym.gymmain'))
    form = LoginForm()
    if form.validate_on_submit():
        print("FORM VALIDATED !!")
        user = SuperUser.query.filter_by(email=form.email.data).first()
        if user is None or not user.check_password(form.password.data):
            flash('Invalid email or password')
            return redirect(url_for('auth.login'))
        login_user(user, remember=form.remember_me.data)
        next_page = request.args.get('next')
        if not next_page or url_parse(next_page).netloc != '':
            if current_user.has_role(['Super Admin', 'Admin']):
                next_page = url_for('admin.admin_dash')

            if current_user.has_role(['Gym']):
                next_page = url_for('gym.gymmain')
        return redirect(next_page)
    else:
        return render_template('home/login.html', title='Log In', login_form=form)

маршрут входа

@bp.route ('/ logout')

def logout():
    print("Logging out !!")
    session.pop('_flashes', None)
    logout_user()
    return redirect(url_for('home.index'))

вход в систему html

@bp.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        if current_user.has_role(['Super Admin', 'Admin']):
            return redirect(url_for('admin.admin_dash'))

        if current_user.has_role(['Gym']):
            return redirect(url_for('gym.gymmain'))
    form = LoginForm()
    if form.validate_on_submit():
        print("FORM VALIDATED !!")
        user = SuperUser.query.filter_by(email=form.email.data).first()
        if user is None or not user.check_password(form.password.data):
            flash('Invalid email or password')
            return redirect(url_for('auth.login'))
        login_user(user, remember=form.remember_me.data)
        next_page = request.args.get('next')
        if not next_page or url_parse(next_page).netloc != '':
            if current_user.has_role(['Super Admin', 'Admin']):
                next_page = url_for('admin.admin_dash')

            if current_user.has_role(['Gym']):
                next_page = url_for('gym.gymmain')
        return redirect(next_page)
    else:
        return render_template('home/login.html', title='Log In', login_form=form)

app init

db = SQLAlchemy()
migrate = Migrate(compare_type=True)
login = LoginManager()
login.login_view = 'auth.login'
csrf = CsrfProtect()


def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)
    with app.app_context():
        db.app = app
        db.init_app(app)
        migrate.init_app(app, db)
        login.init_app(app)
        csrf.init_app(app)
...