11from django .shortcuts import render , redirect
22from django .contrib .auth import logout , login
3+
4+ from core .utils .oauth2 import OAuth2
35from .forms import UserChangeForm , RegisterForm , AccountFinishForm
46from django .contrib .auth .forms import AuthenticationForm
5- from .models import PawUser , GoogleSSOUser
7+ from .models import Oauth2User , PawUser , GoogleSSOUser
68from django .utils import translation
79from django .conf import settings
810from django .contrib .auth .decorators import login_required
@@ -51,6 +53,12 @@ def login_view(request):
5153 request .session ["sso_state" ] = state
5254 # request.session["sso_next_url"] = next_path
5355 request .session .save ()
56+
57+ if settings .OAUTH2_ENABLED :
58+ oauth_sso = OAuth2 ()
59+ oauth2_auth_url , state = oauth_sso .get_authorization_url ()
60+ request .session ["oauth_state" ] = state
61+ request .session .save ()
5462
5563 if request .method == "POST" :
5664 form = AuthenticationForm (request = request , data = request .POST )
@@ -61,8 +69,47 @@ def login_view(request):
6169 else :
6270 form = AuthenticationForm ()
6371
64- return render (request , "core/login.html" , {"form" : form , "google_sso_enabled" : settings .GOOGLE_OAUTH_ENABLED , "google_sso_auth_url" : auth_url })
72+ return render (request , "core/login.html" , {
73+ "form" : form ,
74+ "google_sso_enabled" : settings .GOOGLE_OAUTH_ENABLED ,
75+ "google_sso_auth_url" : auth_url ,
76+ "oauth2_enabled" : settings .OAUTH2_ENABLED ,
77+ "oauth2_auth_url" : oauth2_auth_url ,
78+ })
79+
80+ def oauth2_callback_view (request ):
81+
82+ if not settings .OAUTH2_ENABLED :
83+ return redirect ("login" )
84+ state = request .GET .get ("state" )
6585
86+ if state != request .session .get ("oauth_state" ):
87+ return redirect ("login" )
88+ try :
89+ oauth_sso = OAuth2 ()
90+ _ = oauth_sso .fetch_token (request .GET .get ("code" ))
91+ user_info = oauth_sso .get_user_info ()
92+ except Exception :
93+ return redirect ("login" )
94+ print (user_info )
95+ # Check if user already exists
96+ oauth2_user = Oauth2User .objects .filter (oauth2_id = user_info ["sub" ]).first ()
97+ if oauth2_user :
98+ login (request , oauth2_user .paw_user )
99+ return redirect ("home" )
100+
101+ # Create user if not exists
102+ unique_username = PawUser .objects .filter (username = user_info ["nickname" ]).exists ()
103+ # TODO: Set up account finish form
104+ user , created = PawUser .objects .get_or_create (email = user_info ["email" ], defaults = {
105+ "username" : user_info ["nickname" ] if not unique_username else user_info ["email" ],
106+ "display_name" : user_info ["name" ],
107+ })
108+ if created :
109+ Oauth2User .objects .create (paw_user = user , oauth2_id = user_info ["sub" ])
110+
111+ login (request , user )
112+ return redirect ("home" )
66113
67114def google_callback_view (request ):
68115
@@ -121,7 +168,7 @@ def settings_view(request):
121168 translation .activate (form .cleaned_data ["language" ])
122169 changed_user_language = True
123170
124- if not hasattr (request .user , 'googlessouser' ):
171+ if not hasattr (request .user , 'googlessouser' ) and not hasattr ( request . user , 'oauth2user' ) :
125172 request .user .email = form .cleaned_data ["email" ]
126173
127174 request .user .language = form .cleaned_data ["language" ]
0 commit comments