Почему WTForms не проверяются, даже если токен CSRF совпадает - также нет никаких ошибок в форме. - PullRequest
0 голосов
/ 10 января 2020

У меня странная ситуация в моем приложении flask, когда форма, кажется, отлично подходит для входа в систему, если я делаю это с компьютера, но на моем мобильном телефоне это не так (раньше). Ниже приведен маршрут / login, где я пытаюсь распечатать некоторые подробности происходящего. Первая попытка входа осуществляется с моего телефона, и в результате form.validate_on_submit begin False. Второй из моего P C, а form.validate_on_submit - True. Форма form.csrf_tokens совпадает. Почему validate_on_submit терпит неудачу здесь?

@users.route("/login", methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        print('already authenticated')
        return redirect(url_for('main.home'))
    form = LoginForm()
    print(f'csrf_token: {form.csrf_token}')
    print(f"secret_key: {current_app.config['SECRET_KEY']}")
    if form.validate_on_submit():
        print('form.validate_on_submit')
        user = User.query.filter_by(email=form.email.data).first()
        if user and bcrypt.check_password_hash(user.password, form.password.data):
            login_user(user, remember=form.remember.data)
            access_token = create_access_token(identity = user.username)
            next_page = request.args.get('next')

            return redirect(next_page) if next_page else redirect(url_for('main.home'))
        else:
            flash('Login Unsuccessful. Please check email and password', 'danger')
    print('not validate on submit')
    print(form.errors)
    return render_template('login.html', title='Login', form=form)

Вот LoginForm

class LoginForm(FlaskForm):
    email = StringField('Email',
                        validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    remember = BooleanField('Remember Me')
    submit = SubmitField('Login')

, и вот вывод, который я вижу в моих журналах Heroku (секретный ключ удален, но они совпадают)

2020-01-10T14:37:03.756207+00:00 app[web.1]: 10.63.255.131 - - [10/Jan/2020:14:37:03 +0000] "POST /login HTTP/1.1" 200 5286 "https://mcs-dev-v2.herokuapp.com/login" "Mozilla/5.0 (Linux; Android 10; SM-G973U1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.116 Mobile Safari/537.36"
2020-01-10T14:37:20.015401+00:00 app[web.1]: csrf_token: <input id="csrf_token" name="csrf_token" type="hidden" value="IjJjYzM5NDlmMDQ3YzY4YmYxNzM1NTFjNGJjNTEyNmViZmIxMzAwYTUi.XhiLzg.gebBPzoGNByepWjc_SDipBabw8Q">
2020-01-10T14:37:20.015425+00:00 app[web.1]: secret_key: ----
2020-01-10T14:37:20.015428+00:00 app[web.1]: not validate on submit
2020-01-10T14:37:20.015430+00:00 app[web.1]: {}
2020-01-10T14:37:20.015441+00:00 app[web.1]: 10.93.170.169 - - [10/Jan/2020:14:37:20 +0000] "GET /login HTTP/1.1" 200 5269 "https://mcs-dev-v2.herokuapp.com/home" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
2020-01-10T14:37:20.011108+00:00 heroku[router]: at=info method=GET path="/login" host=mcs-dev-v2.herokuapp.com request_id=18056cd7-12b5-4980-aa13-7016681a053c fwd="173.66.82.76" dyno=web.1 connect=0ms service=5ms status=200 bytes=5445 protocol=https
2020-01-10T14:37:21.533750+00:00 app[web.1]: csrf_token: <input id="csrf_token" name="csrf_token" type="hidden" value="IjJjYzM5NDlmMDQ3YzY4YmYxNzM1NTFjNGJjNTEyNmViZmIxMzAwYTUi.XhiLzg.gebBPzoGNByepWjc_SDipBabw8Q">
2020-01-10T14:37:21.533776+00:00 app[web.1]: secret_key: ----
2020-01-10T14:37:21.534121+00:00 app[web.1]: form.validate_on_submit
...