py-scopes/scopes/api/auth/user.py

46 lines
1.2 KiB
Python

# scopes.api.auth user
from fastapi import APIRouter
import jwt
from pwdlib import PasswordHash
from pydantic import BaseModel, Field
from typing import List
from scopes.api import deps
from scopes.storage import user as st_user
class User(BaseModel):
uid: str | None = None
name: str
login: str
display_name: str
email: str | None = None
pw_hash: str | None = Field(exclude=True, default=None)
groups: List[str] = Field(default_factory=list)
# password handling, authentication
pw_hash = PasswordHash.recommended()
def hashPassword(pw):
return pw_hash.hash(pw)
def verifyPassword(plain, hashed):
return pw_hash.verify(plain, hashed)
async def authenticate(storage: deps.Storage, token: deps.Auth):
payload = jwt.decode(token, settings.jwt_key, algorithms=[settings.jwt_algorithm])
userName = payload.get('sub')
user = getUser(storage, userName)
return user
# routes
router = APIRouter()
@router.get('/users', response_model=list[User])
async def get_users(storage: deps.Storage):
users = storage.create(st_user.Users)
result = [tr.toObject(User) for tr in users.query()]
return result