Я использую Flask с PostgreSQL для хранения пользовательские данные и генерировать токены JWT для аутентификации. Однако при попытке сохранить токен в базе данных после регистрации пользователя он сохраняется неправильно. Кроме того, при попытке подписать токены JWT с помощью моего закрытого ключа оказывается, что подпись выполняется неправильно.
Вот соответствующий фрагмент кода:
Код: Выделить всё
# Relevant code snippet
# Function to generate token
def generate_token(username, email, expiration_time=20):
# Load the private key
with open('private_key.pem', 'r') as f:
private_key = f.read()
payload_data ={
'username': username,
'email': email,
'exp': int(time.time()) + expiration_time
}
token = jwt.encode(
payload=payload_data,
key=private_key,
algorithm='RS256',
)
return token
# Route for user registration
@user_bp.route('/register', methods=['POST'])
def register_user():
# Extract json data from HTTP request using the get_json() method of the request object
data = request.get_json()
# Check if all mandatory fields are filled, if not return error
required_fields = ['username', 'email', 'password', 'confirm_password']
for field in required_fields:
if field not in data or not data[field]:
return jsonify({'error': f'Field {field} missing or empty!'}), 400
username = data['username']
email = data['email']
password = data['password']
confirm_password = data['confirm_password']
if password != confirm_password:
return jsonify({'error': 'Passwords do not match!'}), 400
try:
conn = connect_db()
cursor = conn.cursor()
# Check if username and email of the user already exist in the database, if so return error
cursor.execute("SELECT * FROM users WHERE username=%s OR email=%s", (username, email))
if cursor.fetchone() is not None:
return jsonify({'error': 'Username or email already exists!'}), 400
# Encryption before insertion into the database
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
# Creation of JWT token
expiration_time = 20 # Token expiration time in 20 seconds
token = generate_token(username, email, expiration_time)
print("token before inserting into db:", token)
# Insert the new user into the database
cursor.execute("INSERT INTO users (username, email, password,token) VALUES (%s, %s, %s, %s) RETURNING *",
(username, email, hashed_password.decode('utf-8'), token))
new_user = cursor.fetchone()
print("token before inserting into db:", token)
conn.commit()
if new_user:
user_data = {
'id': new_user[0],
'username': new_user[1],
'email': new_user[2],
'token': new_user[3]
}
else:
return jsonify({'error': 'Error retrieving user data after registration!'}), 500
except Exception as e:
return jsonify({'error': str(e)}), 500
finally:
if 'conn' in locals():
conn.close()
return jsonify({'success': True, 'message': 'User registered successfully!'}), 201
При запуске этого кода токен кажется сгенерированным правильно, но он не сохраняется в базе данных. Кроме того, при попытке использовать закрытый ключ для подписи токенов JWT кажется, что подпись выполнена неправильно.
Я ценю любую помощь или предложения по решению этих проблем.
Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/784 ... -jwt-token