Initial commit
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
from urllib.request import Request
|
||||
|
||||
import httpx
|
||||
from fastapi import HTTPException, Depends, Security
|
||||
from fastapi.security import SecurityScopes
|
||||
from httpx import ConnectError
|
||||
|
||||
from .config import AUTH_SERVER_URL
|
||||
from .model import UserModel, ValidateTokenInput
|
||||
from .schema import oauth2
|
||||
|
||||
|
||||
async def validate_token(_input: ValidateTokenInput):
|
||||
try:
|
||||
client = httpx.AsyncClient()
|
||||
headers = {'Content-Type': 'application/json', }
|
||||
result = await client.request('POST', AUTH_SERVER_URL, json=_input.dict(), headers=headers)
|
||||
export = result.text
|
||||
if 'application/json' in result.headers['content-type']:
|
||||
export = result.json()
|
||||
if result.status_code > 299:
|
||||
raise HTTPException(status_code=result.status_code, detail=export)
|
||||
return export
|
||||
except ConnectError as e:
|
||||
raise HTTPException(status_code=400, detail=str(e))
|
||||
except HTTPException as e:
|
||||
raise e
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=400, detail=str(e))
|
||||
|
||||
|
||||
async def get_current_user(security_scopes: SecurityScopes, token: str = Depends(oauth2)):
|
||||
if security_scopes.scopes:
|
||||
authenticate_value = f'Bearer scope="{security_scopes.scope_str}"'
|
||||
else:
|
||||
authenticate_value = f"Bearer"
|
||||
credentials_exception = HTTPException(
|
||||
status_code=401,
|
||||
detail="Could not validate credentials a",
|
||||
headers={"WWW-Authenticate": authenticate_value},
|
||||
)
|
||||
user = await validate_token(ValidateTokenInput(token=token, scopes=security_scopes.scopes))
|
||||
if user is None:
|
||||
raise credentials_exception
|
||||
user.scopes = security_scopes.scopes if isinstance(
|
||||
security_scopes.scopes, list) else security_scopes.scopes
|
||||
return user
|
||||
|
||||
|
||||
async def get_current_active_user(request: Request, current_user: UserModel = Security(get_current_user, scopes=["account"]),):
|
||||
if current_user.disabled:
|
||||
raise HTTPException(status_code=400, detail="Inactive user")
|
||||
request.state.user = UserModel(**current_user.dict())
|
||||
return current_user
|
||||
Reference in New Issue
Block a user