# WIP: OAuth draft implementation
* first working client implementation of oauth workflow for logging in users
This commit is contained in:
@@ -5,12 +5,16 @@ Contact: michel.peltriaux@sgdnord.rlp.de
|
||||
Created on: 15.11.21
|
||||
|
||||
"""
|
||||
import json
|
||||
|
||||
import requests
|
||||
from django.contrib.auth.models import AbstractUser
|
||||
|
||||
from django.db import models
|
||||
|
||||
from api.models import APIUserToken
|
||||
from konova.settings import ZB_GROUP, DEFAULT_GROUP, ETS_GROUP
|
||||
from konova.sub_settings.sso_settings import SSO_SERVER_BASE
|
||||
from konova.utils.mailer import Mailer
|
||||
from user.enums import UserNotificationEnum
|
||||
|
||||
@@ -214,4 +218,41 @@ class User(AbstractUser):
|
||||
shared_teams = self.teams.filter(
|
||||
deleted__isnull=True
|
||||
)
|
||||
return shared_teams
|
||||
return shared_teams
|
||||
|
||||
@staticmethod
|
||||
def _oauth_update_user(user_data: dict):
|
||||
username = user_data.get("username")
|
||||
user, is_created = User.objects.get_or_create(
|
||||
username=username
|
||||
)
|
||||
if is_created:
|
||||
user.set_unusable_password()
|
||||
|
||||
user.first_name = user_data.get("first_name")
|
||||
user.last_name = user_data.get("last_name")
|
||||
user.email = user_data.get("email")
|
||||
|
||||
return user
|
||||
|
||||
@staticmethod
|
||||
def oauth_get_user(oauth_access_token: str):
|
||||
url = f"{SSO_SERVER_BASE}users/oauth/data"
|
||||
|
||||
response = requests.get(
|
||||
url,
|
||||
headers={
|
||||
"Authorization":f"Bearer {oauth_access_token}",
|
||||
}
|
||||
)
|
||||
|
||||
is_response_code_invalid = response.status_code != 200
|
||||
if is_response_code_invalid:
|
||||
raise RuntimeError(f"OAuth user data fetching unsuccessful: {response.status_code}")
|
||||
|
||||
response_content = response.content.decode("utf-8")
|
||||
response_content = json.loads(response_content)
|
||||
user = User._oauth_update_user(response_content)
|
||||
|
||||
return user
|
||||
|
||||
|
||||
Reference in New Issue
Block a user