kers/oauth/views.py

78 lines
2.7 KiB
Python
Raw Normal View History

2020-07-22 01:48:22 +00:00
import logging
import requests
2020-07-22 02:32:25 +00:00
from django.conf import settings
2020-07-22 02:05:34 +00:00
from django.contrib.auth import login
from django.http.request import HttpRequest
from django.shortcuts import redirect
2020-07-22 03:48:19 +00:00
import users
2020-07-22 02:05:34 +00:00
from users.models import CustomUser
2020-07-22 01:48:22 +00:00
logger = logging.getLogger(__file__)
2020-07-22 02:05:34 +00:00
2020-07-22 01:48:22 +00:00
class OAuthException(Exception):
pass
def register(_):
RESPONSE_TYPE = 'code'
2020-07-22 02:32:25 +00:00
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"]}')
2020-07-22 01:48:22 +00:00
def register_callback(req: HttpRequest):
code = req.GET['code']
2020-07-22 03:28:46 +00:00
csrftoken = req.COOKIES.get('csrftoken')
print(csrftoken)
2020-07-22 03:44:49 +00:00
response = requests.post(settings.OAUTH["ACCESS_TOKEN_URI"],
2020-07-22 03:48:19 +00:00
data={'code': code,
'grant_type': 'authorization_code',
'client_id': settings.OAUTH["CLIENT_ID"],
2020-07-22 02:32:25 +00:00
'client_secret': settings.OAUTH["CLIENT_SECRET"],
2020-07-22 03:48:19 +00:00
'redirect_uri': settings.OAUTH["REDIRECT_URI"]},
2020-07-22 03:28:46 +00:00
cookies=None,
headers={'Referer': f'{settings.SERVER_URL}/login/zeus/register'})
2020-07-22 01:48:22 +00:00
try:
if response.status_code == 200:
json: dict = response.json()
2020-07-22 03:28:46 +00:00
print(response.cookies)
2020-07-22 01:48:22 +00:00
# TODO: maybe later do something with the refresh token.
2020-07-22 03:28:46 +00:00
user: dict = user_info(json['access_token'], csrftoken)
2020-07-22 01:48:22 +00:00
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"]}')
2020-07-22 02:28:01 +00:00
validated_user = validate_user(user['id'], user['username'])
2020-07-22 02:05:34 +00:00
login(req, validated_user)
redirect('/')
2020-07-22 01:48:22 +00:00
else:
2020-07-22 03:28:46 +00:00
print(response.request)
2020-07-22 03:44:49 +00:00
raise OAuthException(f'Status code not 200, response: {response}: {response.text}')
2020-07-22 01:48:22 +00:00
except OAuthException as e:
logger.error(e)
2020-07-22 03:28:46 +00:00
return redirect('/')
2020-07-22 01:48:22 +00:00
2020-07-22 02:05:34 +00:00
def validate_user(zeus_id, username) -> CustomUser:
2020-07-22 03:48:19 +00:00
try:
user = CustomUser.objects.get(zeus_id=zeus_id)
user.username = username
user.save()
return user
except users.models.CustomUser.DoesNotExist as e:
2020-07-22 02:05:34 +00:00
return CustomUser.objects.create_user(zeus_id, username)
2020-07-22 03:28:46 +00:00
def user_info(access_token, csrftoken):
r = requests.get(
settings.OAUTH["USER_API_URI"],
headers={'Authorization': f'Bearer {access_token}'},
cookies={'csrftoken': csrftoken}
)
2020-07-22 01:48:22 +00:00
return r.json()