49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
from models import User
|
|
from passlib.context import CryptContext
|
|
import sqlite3
|
|
import jwt
|
|
import datetime
|
|
|
|
JWT_SECRET = "secret"
|
|
|
|
connection = sqlite3.connect('database.db')
|
|
connection.row_factory = sqlite3.Row
|
|
cursor = connection.cursor()
|
|
|
|
password_context = CryptContext(schemes=["sha256_crypt"], deprecated="auto")
|
|
|
|
def init() -> None:
|
|
# create users table
|
|
cursor.execute('''
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY,
|
|
name TEXT NOT NULL UNIQUE,
|
|
password TEXT NOT NULL
|
|
)
|
|
''')
|
|
|
|
def close() -> None:
|
|
connection.close()
|
|
|
|
|
|
def register(user: User) -> None:
|
|
password = password_context.hash(user.password)
|
|
cursor.execute("INSERT INTO users (name, password) VALUES (?, ?)", (user.name, password))
|
|
connection.commit()
|
|
|
|
def login(user: User) -> str:
|
|
cursor.execute("SELECT id, name, password FROM users WHERE name = ?", (user.name,))
|
|
row = cursor.fetchone()
|
|
|
|
if not row:
|
|
raise Exception('User not found')
|
|
if not password_context.verify(user.password, row["password"]):
|
|
raise Exception('Invalid password')
|
|
|
|
exp = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(hours=1)
|
|
payload = {
|
|
"id": row["id"],
|
|
"exp": exp
|
|
}
|
|
|
|
return jwt.encode(payload=payload, key=JWT_SECRET, algorithm="HS256") |