9
9
from ..exceptions import BadCredentialException
10
10
from ..libs import bearer_transport , get_jwt_strategy
11
11
from ..models import User
12
- from .constants import GOOGLE_USERINFO_API
12
+ from .constants import GOOGLE_USERINFO_URL
13
13
14
14
15
15
class GoogleAuthBackend (AuthenticationBackend ):
16
16
async def login (self , strategy : Strategy , user : User , response : Response ) -> Any :
17
17
strategy_response = await super ().login (strategy , user , response )
18
18
token = self .get_google_access_token (user )
19
- userinfo = get_profile_from_google (token )
20
- user .first_name = userinfo .get ('given_name' )
21
- user .last_name = userinfo .get ('family_name' )
22
- user .picture = userinfo .get ('picture' )
23
- user .last_login_at = datetime .now ()
24
- await user .save ()
19
+ profile = get_profile (token )
20
+ await update_profile (user , profile ).save ()
25
21
return strategy_response
26
22
27
23
def get_google_access_token (self , user : User ) -> Optional [str ]:
@@ -31,15 +27,26 @@ def get_google_access_token(self, user: User) -> Optional[str]:
31
27
return None
32
28
33
29
34
- def get_profile_from_google (access_token : str ) -> dict :
35
- response = requests .get (url = GOOGLE_USERINFO_API ,
30
+ def get_profile (access_token : str ) -> dict :
31
+ response = requests .get (url = GOOGLE_USERINFO_URL ,
36
32
params = {'access_token' : access_token })
37
33
if not response .ok :
38
34
raise BadCredentialException (
39
35
'Failed to get user information from Google.' )
40
36
return response .json ()
41
37
42
38
39
+ def update_profile (user : User , profile : dict ) -> User :
40
+ if user .first_name == None :
41
+ user .first_name = profile .get ('given_name' )
42
+ if user .last_name == None :
43
+ user .last_name = profile .get ('family_name' )
44
+ if user .picture == None :
45
+ user .picture = profile .get ('picture' )
46
+ user .last_login_at = datetime .now ()
47
+ return user
48
+
49
+
43
50
auth_backend_google = GoogleAuthBackend (
44
51
name = "jwt-google" ,
45
52
transport = bearer_transport ,
0 commit comments