kers/oauth/views.py
2020-07-22 05:48:19 +02:00

78 lines
2.7 KiB
Python

import logging
import requests
from django.conf import settings
from django.contrib.auth import login
from django.http.request import HttpRequest
from django.shortcuts import redirect
import users
from users.models import CustomUser
logger = logging.getLogger(__file__)
class OAuthException(Exception):
pass
def register(_):
RESPONSE_TYPE = 'code'
return redirect(f'{settings.OAUTH["AUTHORIZE_URI"]}?'
f'response_type={RESPONSE_TYPE}&'
f'client_id={settings.OAUTH["CLIENT_ID"]}&'
f'redirect_uri={settings.OAUTH["REDIRECT_URI"]}')
def register_callback(req: HttpRequest):
code = req.GET['code']
csrftoken = req.COOKIES.get('csrftoken')
print(csrftoken)
response = requests.post(settings.OAUTH["ACCESS_TOKEN_URI"],
data={'code': code,
'grant_type': 'authorization_code',
'client_id': settings.OAUTH["CLIENT_ID"],
'client_secret': settings.OAUTH["CLIENT_SECRET"],
'redirect_uri': settings.OAUTH["REDIRECT_URI"]},
cookies=None,
headers={'Referer': f'{settings.SERVER_URL}/login/zeus/register'})
try:
if response.status_code == 200:
json: dict = response.json()
print(response.cookies)
# TODO: maybe later do something with the refresh token.
user: dict = user_info(json['access_token'], csrftoken)
if 'username' not in user.keys() or 'id' not in user.keys():
raise OAuthException(f'username and id are expected values: {user}')
else:
logger.debug(f'Succesfully authenticated user: {user["username"]} with id: {user["id"]}')
validated_user = validate_user(user['id'], user['username'])
login(req, validated_user)
redirect('/')
else:
print(response.request)
raise OAuthException(f'Status code not 200, response: {response}: {response.text}')
except OAuthException as e:
logger.error(e)
return redirect('/')
def validate_user(zeus_id, username) -> CustomUser:
try:
user = CustomUser.objects.get(zeus_id=zeus_id)
user.username = username
user.save()
return user
except users.models.CustomUser.DoesNotExist as e:
return CustomUser.objects.create_user(zeus_id, username)
def user_info(access_token, csrftoken):
r = requests.get(
settings.OAUTH["USER_API_URI"],
headers={'Authorization': f'Bearer {access_token}'},
cookies={'csrftoken': csrftoken}
)
return r.json()