Я пытаюсь создать базовую функцию входа в систему с помощью Flask, Werkzeug и SQLite. Пользователи могут зарегистрироваться, и хэш их пароля хранится в базе данных SQLite, хотя, когда я пытаюсь войти в систему с использованием правильного пароля, check_password_hash возвращает false.

В настоящее время я сравниваю пароль, предоставленный пользователем, с соответствующим хешем, хранящимся в базе данных SQLite, который был создан с помощью generate_password_hash при регистрации пользователя. Я прочитал документацию Werkzeug, но не нашел решения.

Возможно, это связано с тем, что generate_password_hash никогда не выводит один и тот же хеш дважды? Хотя я думал, что check_password_hash может это обойти?

Вот код:

@app.route("/register", methods=["GET", "POST"])
def register():
    """Register user"""
    if request.method == "GET":
        return render_template("register.html")
    if request.method == "POST":
            with sqlite3.connect("finance.db") as conn:
                cur = conn.cursor() 
                username = request.form.get("username")
                password = request.form.get("password")
                confirm_password = request.form.get("confirm-password")
                hash_value = generate_password_hash(password)
                cur.execute("SELECT * FROM users WHERE username=?", (username,))
                valid_username = cur.fetchone()
                
                # Check input and format: Username already taken? Username entered? Password entered? passwords match?
                if valid_username:
                    return ("Username not available")
                if not username:
                    return("Please enter a username")
                elif not password:
                    return("Please enter a password")
                elif not confirm_password:
                    return("Please confirm your password")
                elif password != confirm_password:
                    return ("Passwords do not match")
                else:
                    cur.execute("INSERT INTO users (username,hash) VALUES (?,?)", (username,hash_value))
                    return redirect("/")



@app.route("/login", methods=["GET", "POST"])
def login():
    """Log user in"""

    # Forget any user_id
    session.clear()

    # User reached route via POST (as by submitting a form via POST)
    if request.method == "POST":

        # Ensure username was submitted
        if not request.form.get("username"):
            return apology("must provide username", 403)

        # Ensure password was submitted
        elif not request.form.get("password"):
            return apology("must provide password", 403)
# User login
# Query database for username and hash
        with sqlite3.connect("finance.db") as conn:
            cur = conn.cursor()
            username_field = request.form.get("username")
            cur.execute("SELECT username FROM users WHERE username = ?", (username_field,))
            username = cur.fetchall()
            cur.execute("SELECT hash FROM users WHERE username = ?", (username_field,))
            pwhash = cur.fetchone()

            # Ensure username exists and password is correct           
            if len(username) != 1 or not check_password_hash(pwhash, request.form.get("password")):
                print(check_password_hash(pwhash, request.form.get("password")))
                return apology("invalid username and/or password", 403)
            return redirect("/")

    # User reached route via GET (as by clicking a link or via redirect)
    else:
        return render_template("login.html")

Заранее благодарю за любую помощь.

-1
Ambassador Kosh 11 Ноя 2020 в 14:51

1 ответ

Лучший ответ

Ага! Решил это. Синтаксическая ошибка, pwhash` является кортежем, потому что это то, что возвращает fetchone (), поэтому это должно быть check_password_hash (pwhash [0], request.form.get ("пароль")) Большое спасибо за поддержку. Мне не приходило в голову тестировать функцию check_password_hash изолированно, это заставило меня понять, что я работаю с кортежем. Приветствую @JanL. Хорошего дня.

0
Ambassador Kosh 11 Ноя 2020 в 13:34