forked from wownero/YellWOWPages
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
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
|