You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
YellWOWPages/routers/auth.py

69 lines
2.8 KiB

from fastapi import APIRouter, Request, Cookie
from fastapi.responses import RedirectResponse, HTMLResponse
import requests
from icecream import ic
import secrets
from classes.constraints import Constraints
router = APIRouter()
@router.get('/login')
async def get_login(request: Request):
state = secrets.token_hex(10)
response = RedirectResponse(
'https://login.wownero.com/auth/realms/master/protocol/openid-connect/auth?'f'client_id='
f'{Constraints.client_id}&redirect_uri=https://yellow.wownero.com/authenticate&'
f'response_type=code&state={state}')
response.set_cookie(key='state', value=state)
return response
@router.get('/authenticate')
async def get_auth(request: Request, state: str = Cookie(None)):
params = request.query_params
if state is None:
return Constraints.templates.TemplateResponse('/errors/index.html',
{'request': request,
'error': '`state` security code not found...',
'url': '/login'})
if params['state'] != state:
return Constraints.templates.TemplateResponse('/errors/index.html',
{'request': request,
'error': '`state` security code is wrong',
'url': '/login'})
url = "https://login.wownero.com/auth/realms/master/protocol/openid-connect/token"
data = {
"grant_type": "authorization_code",
"code": params["code"],
"redirect_uri": "http://127.0.0.1:8080/authenticate",
"client_id": f'{Constraints.client_id}',
"client_secret": f'{Constraints.client_secret}',
"state": params['state']
}
r = requests.post(url=url, data=data)
response = r.json()
if response.get('error', None) is not None:
return Constraints.templates.TemplateResponse('/errors/index.html',
{'request': request, 'error': r.json()['error_description'],
'url': '/login'})
auth_code = response.get('access_token', None)
if auth_code is None:
return Constraints.templates.TemplateResponse('/errors/index.html',
{'request': request, 'error': 'invalid auth code',
'url': '/login'})
response = RedirectResponse('/dashboard')
response.set_cookie(key='auth_code', value=auth_code)
response.delete_cookie(key='state')
return response
@router.get('/logout')
async def get_logout():
response = RedirectResponse('/root')
response.delete_cookie('auth_code')
return response