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.

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=http://127.0.0.1:8080/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