# OAuth migrations

* adds migrations for storing OAuthToken
* adds OAuthToken model
* adds OAuthToken admin
* adds user migration for Fkey relation to OAuthToken
This commit is contained in:
2024-04-30 14:56:48 +02:00
parent f135008447
commit 8ff3cb9adc
7 changed files with 213 additions and 35 deletions

View File

@@ -7,7 +7,6 @@ Created on: 26.04.24
"""
import base64
import hashlib
import json
from urllib.parse import urlencode
import requests
@@ -15,10 +14,11 @@ from django.contrib.auth import login
from django.http import HttpRequest
from django.shortcuts import redirect
from django.urls import reverse
from django.utils.timezone import now
from django.views import View
from api.models import OAuthToken
from konova.sub_settings.sso_settings import SSO_SERVER_BASE, OAUTH_CODE_VERIFIER, OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET
from user.models import User
class OAuthLoginView(View):
@@ -95,7 +95,7 @@ class OAuthCallbackView(View):
authentication_code = request.GET.get("code")
oauth_acces_token_url = f"{SSO_SERVER_BASE}o/token/"
next_callback_url = request.build_absolute_uri(
callback_url = request.build_absolute_uri(
reverse(
"oauth-callback"
)
@@ -104,7 +104,7 @@ class OAuthCallbackView(View):
params = {
"grant_type": "authorization_code",
"code": authentication_code,
"redirect_uri": next_callback_url,
"redirect_uri": callback_url,
"code_verifier": OAUTH_CODE_VERIFIER,
"client_id": OAUTH_CLIENT_ID,
"client_secret": OAUTH_CLIENT_SECRET
@@ -113,18 +113,18 @@ class OAuthCallbackView(View):
oauth_acces_token_url,
data=params
)
received_on = now()
access_code_response_body = access_code_response.content.decode("utf-8")
status_code_invalid = access_code_response.status_code != 200
if status_code_invalid:
raise RuntimeError(f"OAuth access token could not be fetched: {access_code_response.text}")
access_code_response_body = json.loads(access_code_response_body)
access_token = access_code_response_body.get("access_token")
if not access_token:
raise RuntimeError(f"Access token response contained no token: {access_code_response_body}")
oauth_access_token = OAuthToken.from_access_token_response(access_code_response_body, received_on)
oauth_access_token.save()
user = oauth_access_token.update_and_get_user()
user.oauth_replace_token(oauth_access_token)
user = User.oauth_get_user(access_token)
login(request, user)
return redirect("home")