# OAuth refactoring code
* refactors code
This commit is contained in:
parent
94b7f3ad70
commit
f135008447
@ -19,4 +19,6 @@ OAUTH_CODE_VERIFIER = ''.join(
|
|||||||
random.choice(
|
random.choice(
|
||||||
string.ascii_uppercase + string.digits
|
string.ascii_uppercase + string.digits
|
||||||
) for _ in range(random.randint(43, 128))
|
) for _ in range(random.randint(43, 128))
|
||||||
)
|
)
|
||||||
|
OAUTH_CLIENT_ID = "CHANGE_ME"
|
||||||
|
OAUTH_CLIENT_SECRET = "CHANGE_ME"
|
@ -17,17 +17,78 @@ from django.shortcuts import redirect
|
|||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.views import View
|
from django.views import View
|
||||||
|
|
||||||
from konova.sub_settings.sso_settings import SSO_SERVER_BASE, OAUTH_CODE_VERIFIER
|
from konova.sub_settings.sso_settings import SSO_SERVER_BASE, OAUTH_CODE_VERIFIER, OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET
|
||||||
from user.models import User
|
from user.models import User
|
||||||
|
|
||||||
OAUTH_CLIENT_ID = "CHANGE_ME"
|
|
||||||
OAUTH_CLIENT_SECRET = "CHANGE_ME"
|
class OAuthLoginView(View):
|
||||||
|
"""
|
||||||
|
Starts OAuth Login procedure
|
||||||
|
-> AnonymousUser is redirected to SSO component using specific parameters
|
||||||
|
-> After successful login (in SSO component), user will be redirected to a specific callback url (OAuthCallbackView)
|
||||||
|
-> Callback view uses retrieved authorization token to get a proper access token from SSO component
|
||||||
|
-> SSO component answers with access token
|
||||||
|
-> OAuthCallbackView uses token in Authorization header to access user data of logged-in user in SSO component
|
||||||
|
-> OAuthCallbackView creates/updates user
|
||||||
|
-> OAuthCallbackView logs in user and redirects to default home view
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __create_code_challenge(self):
|
||||||
|
"""
|
||||||
|
Creates a code verifier and code challenge for extra security.
|
||||||
|
See https://django-oauth-toolkit.readthedocs.io/en/latest/getting_started.html#authorization-code for further
|
||||||
|
information
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
"""
|
||||||
|
code_verifier = OAUTH_CODE_VERIFIER
|
||||||
|
|
||||||
|
code_challenge = hashlib.sha256(code_verifier.encode('utf-8')).digest()
|
||||||
|
code_challenge = base64.urlsafe_b64encode(code_challenge).decode('utf-8').replace('=', '')
|
||||||
|
return code_verifier, code_challenge
|
||||||
|
|
||||||
|
def get(self, request: HttpRequest, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
Redirects user to OAuth SSO webservice for credential based login there
|
||||||
|
|
||||||
|
Args:
|
||||||
|
request ():
|
||||||
|
*args ():
|
||||||
|
**kwargs ():
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
"""
|
||||||
|
oauth_authentication_code_url = f"{SSO_SERVER_BASE}o/authorize/"
|
||||||
|
code_verifier, code_challenge = self.__create_code_challenge()
|
||||||
|
|
||||||
|
urlencode_params = urlencode(
|
||||||
|
{
|
||||||
|
"response_type": "code",
|
||||||
|
"code_challenge": code_challenge,
|
||||||
|
"code_challenge_method": "S256",
|
||||||
|
"client_id": OAUTH_CLIENT_ID,
|
||||||
|
"redirect_uri": request.build_absolute_uri(
|
||||||
|
reverse(
|
||||||
|
"oauth-callback"
|
||||||
|
)
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
url = f"{oauth_authentication_code_url}?{urlencode_params}"
|
||||||
|
return redirect(url)
|
||||||
|
|
||||||
|
|
||||||
class OAuthCallbackView(View):
|
class OAuthCallbackView(View):
|
||||||
"""
|
"""
|
||||||
Callback view for a OAuth2.0 authentication token.
|
Callback view for OAuth2.0 authentication token.
|
||||||
Authentication tokens need to be exchanged for the access token.
|
Authentication tokens will be exchanged for access token.
|
||||||
|
Access Token will be used for fetching user data from SSO component.
|
||||||
|
User data will be used for creating/updating user data inside this app.
|
||||||
|
User will be logged-in and redirected to default home view.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def get(self, request: HttpRequest, *args, **kwargs):
|
def get(self, request: HttpRequest, *args, **kwargs):
|
||||||
@ -67,51 +128,3 @@ class OAuthCallbackView(View):
|
|||||||
login(request, user)
|
login(request, user)
|
||||||
return redirect("home")
|
return redirect("home")
|
||||||
|
|
||||||
|
|
||||||
class OAuthLoginView(View):
|
|
||||||
|
|
||||||
def __create_code_challenge(self):
|
|
||||||
"""
|
|
||||||
Creates a code verifier and code challenge for extra security.
|
|
||||||
See https://django-oauth-toolkit.readthedocs.io/en/latest/getting_started.html#authorization-code for further
|
|
||||||
information
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
"""
|
|
||||||
code_verifier = OAUTH_CODE_VERIFIER
|
|
||||||
|
|
||||||
code_challenge = hashlib.sha256(code_verifier.encode('utf-8')).digest()
|
|
||||||
code_challenge = base64.urlsafe_b64encode(code_challenge).decode('utf-8').replace('=', '')
|
|
||||||
return code_verifier, code_challenge
|
|
||||||
|
|
||||||
def get(self, request: HttpRequest, *args, **kwargs):
|
|
||||||
""" Redirects user to OAuth SSO webservice
|
|
||||||
|
|
||||||
Args:
|
|
||||||
request ():
|
|
||||||
*args ():
|
|
||||||
**kwargs ():
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
|
|
||||||
"""
|
|
||||||
oauth_authentication_code_url = f"{SSO_SERVER_BASE}o/authorize/"
|
|
||||||
code_verifier, code_challenge = self.__create_code_challenge()
|
|
||||||
print(code_verifier)
|
|
||||||
|
|
||||||
urlencode_params = urlencode(
|
|
||||||
{
|
|
||||||
"response_type": "code",
|
|
||||||
"code_challenge": code_challenge,
|
|
||||||
"code_challenge_method": "S256",
|
|
||||||
"client_id": OAUTH_CLIENT_ID,
|
|
||||||
"redirect_uri": request.build_absolute_uri(
|
|
||||||
reverse(
|
|
||||||
"oauth-callback"
|
|
||||||
)
|
|
||||||
),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
url = f"{oauth_authentication_code_url}?{urlencode_params}"
|
|
||||||
return redirect(url)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user