implement login

This commit is contained in:
2021-06-12 13:24:26 +02:00
parent 3920183e0c
commit c33c08fe0a
10 changed files with 134 additions and 14 deletions

32
ki/auth.py Normal file
View File

@ -0,0 +1,32 @@
import uuid
import yaml
from app import app, db
from ki.models import User, Token
def auth(username, password):
auth_file_path = app.config["KI_DATA_DIR"] + "/auth.yml"
with open(auth_file_path, "r") as auth_file_stream:
users = yaml.safe_load(auth_file_stream)
if username not in users:
return None
auth_user = users[username]
if auth_user["password"] != password:
return None
user = User.query.filter(User.auth_id.__eq__(username)).first()
if user is None:
user = User(nickname=username, auth_id=username)
db.session.add(user)
token = Token(token=str(uuid.uuid4()), user=user)
db.session.add(token)
db.session.commit()
return token

View File

@ -14,15 +14,15 @@ class User(db.Model):
pronouns = Column(String(25), default="")
volunteerwork = Column(String(4000), default="")
freetext = Column(String(4000), default="")
created = Column(DateTime, nullable=False)
updated = Column(DateTime, onupdate=datetime.now, nullable=False)
auth_id = Column(String(50), nullable=False)
created = Column(DateTime, nullable=False, default=datetime.now)
updated = Column(DateTime, onupdate=datetime.now, nullable=False, default=datetime.now)
auth_id = Column(String(50), nullable=False, unique=True)
contacts = relationship("Contact")
address = relationship("Address", uselist=False, back_populates="user")
tokens = relationship("Token", uselist=False, back_populates="user")
skills = relationship("UserSkill", back_populates="users")
languages = relationship("UserLanguage", "users")
skills = relationship("UserSkill", back_populates="user")
languages = relationship("UserLanguage", back_populates="user")
class Token(db.Model):
@ -75,7 +75,7 @@ class Skill(db.Model):
id = Column(Integer, primary_key=True)
name = Column(String(25), unique=True, nullable=False)
users = relationship("User", back_populates="skills")
users = relationship("UserSkill", back_populates="skill")
def to_dict(self):
return {"id": self.id, "name": self.name}
@ -98,7 +98,7 @@ class Language(db.Model):
id = Column(String(2), primary_key=True)
name = Column(String(25), nullable=False)
users = relationship("UserLanguage", back_populates="languages")
users = relationship("UserLanguage", back_populates="language")
def to_dict(self):
return {"id": self.id, "name": self.name}

View File

@ -1,6 +1,7 @@
import os
from flask import make_response, request, send_file
from flask import jsonify, make_response, request, send_file
from ki.auth import auth
from ki.models import Language, Skill
from app import app
@ -64,6 +65,17 @@ def handle_icon_request(model, id, path):
def hello_world():
return "KI"
@app.route("/users/login", methods=["POST"])
def login():
username = request.json.get("username", "")
password = request.json.get("password", "")
token = auth(username, password)
if token is None:
return make_response({}, 403)
return make_response({"token": token.token})
@app.route("/skills")
def get_skills():