Skip to content

Commit 60e761d

Browse files
committed
Added plain Django views
1 parent 052c5ba commit 60e761d

File tree

2 files changed

+158
-0
lines changed

2 files changed

+158
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
from django import forms
2+
from django.contrib.auth import login
3+
from django.http import JsonResponse
4+
from django.shortcuts import redirect
5+
from django.views import View
6+
7+
from styleguide_example.blog_examples.google_login_server_flow.raw.service import (
8+
GoogleRawLoginFlowService,
9+
)
10+
from styleguide_example.users.selectors import user_list
11+
12+
13+
class GoogleLoginRedirectApi(View):
14+
def get(self, request, *args, **kwargs):
15+
google_login_flow = GoogleRawLoginFlowService()
16+
17+
authorization_url, state = google_login_flow.get_authorization_url()
18+
19+
request.session["google_oauth2_state"] = state
20+
21+
return redirect(authorization_url)
22+
23+
24+
class GoogleLoginApi(View):
25+
class InputValidationForm(forms.Form):
26+
code = forms.CharField(required=False)
27+
error = forms.CharField(required=False)
28+
state = forms.CharField(required=False)
29+
30+
def get(self, request, *args, **kwargs):
31+
input_form = self.InputValidationForm(data=request.GET)
32+
33+
if not input_form.is_valid():
34+
return
35+
36+
validated_data = input_form.cleaned_data
37+
38+
code = validated_data["code"] if validated_data.get("code") != "" else None
39+
error = validated_data["error"] if validated_data.get("error") != "" else None
40+
state = validated_data["state"] if validated_data.get("state") != "" else None
41+
42+
if error is not None:
43+
return JsonResponse({"error": error}, status=400)
44+
45+
if code is None or state is None:
46+
return JsonResponse({"error": "Code and state are required."}, status=400)
47+
48+
session_state = request.session.get("google_oauth2_state")
49+
50+
if session_state is None:
51+
return JsonResponse({"error": "CSRF check failed."}, status=400)
52+
53+
del request.session["google_oauth2_state"]
54+
55+
if state != session_state:
56+
return JsonResponse({"error": "CSRF check failed."}, status=400)
57+
58+
google_login_flow = GoogleRawLoginFlowService()
59+
60+
google_tokens = google_login_flow.get_tokens(code=code)
61+
62+
id_token_decoded = google_tokens.decode_id_token()
63+
user_info = google_login_flow.get_user_info(google_tokens=google_tokens)
64+
65+
user_email = id_token_decoded["email"]
66+
request_user_list = user_list(filters={"email": user_email})
67+
user = request_user_list.get() if request_user_list else None
68+
69+
if user is None:
70+
return JsonResponse({"error": f"User with email {user_email} is not found."}, status=404)
71+
72+
login(request, user)
73+
74+
result = {
75+
"id_token_decoded": id_token_decoded,
76+
"user_info": user_info,
77+
}
78+
79+
return JsonResponse(result, status=200)
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
from django import forms
2+
from django.contrib.auth import login
3+
from django.http import JsonResponse
4+
from django.shortcuts import redirect
5+
from django.views import View
6+
7+
from styleguide_example.blog_examples.google_login_server_flow.sdk.services import (
8+
GoogleSdkLoginFlowService,
9+
)
10+
from styleguide_example.users.selectors import user_list
11+
12+
13+
class GoogleLoginRedirectApi(View):
14+
def get(self, request, *args, **kwargs):
15+
google_login_flow = GoogleSdkLoginFlowService()
16+
17+
authorization_url, state = google_login_flow.get_authorization_url()
18+
19+
request.session["google_oauth2_state"] = state
20+
21+
return redirect(authorization_url)
22+
23+
24+
class GoogleLoginApi(View):
25+
class InputValidationForm(forms.Form):
26+
code = forms.CharField(required=False)
27+
error = forms.CharField(required=False)
28+
state = forms.CharField(required=False)
29+
30+
def get(self, request, *args, **kwargs):
31+
input_form = self.InputValidationForm(data=request.GET)
32+
33+
if not input_form.is_valid():
34+
return
35+
36+
validated_data = input_form.cleaned_data
37+
38+
code = validated_data["code"] if validated_data.get("code") != "" else None
39+
error = validated_data["error"] if validated_data.get("error") != "" else None
40+
state = validated_data["state"] if validated_data.get("state") != "" else None
41+
42+
if error is not None:
43+
return JsonResponse({"error": error}, status=400)
44+
45+
if code is None or state is None:
46+
return JsonResponse({"error": "Code and state are required."}, status=400)
47+
48+
session_state = request.session.get("google_oauth2_state")
49+
50+
if session_state is None:
51+
return JsonResponse({"error": "CSRF check failed."}, status=400)
52+
53+
del request.session["google_oauth2_state"]
54+
55+
if state != session_state:
56+
return JsonResponse({"error": "CSRF check failed."}, status=400)
57+
58+
google_login_flow = GoogleSdkLoginFlowService()
59+
60+
google_tokens = google_login_flow.get_tokens(code=code, state=state)
61+
62+
id_token_decoded = google_tokens.decode_id_token()
63+
user_info = google_login_flow.get_user_info(google_tokens=google_tokens)
64+
65+
user_email = id_token_decoded["email"]
66+
request_user_list = user_list(filters={"email": user_email})
67+
user = request_user_list.get() if request_user_list else None
68+
69+
if user is None:
70+
return JsonResponse({"error": f"User with email {user_email} is not found."}, status=404)
71+
72+
login(request, user)
73+
74+
result = {
75+
"id_token_decoded": id_token_decoded,
76+
"user_info": user_info,
77+
}
78+
79+
return JsonResponse(result, status=200)

0 commit comments

Comments
 (0)