Skip to content

Commit 0666530

Browse files
committed
fix(oauth2): do not update profile when not null
1 parent 078f2cb commit 0666530

File tree

3 files changed

+29
-14
lines changed

3 files changed

+29
-14
lines changed

fastapi/app/auth/github/libs.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@ async def login(self, strategy: Strategy, user: User, response: Response) -> Any
1717
strategy_response = await super().login(strategy, user, response)
1818
token = self.get_google_access_token(user)
1919
profile = get_profile(token)
20-
user.first_name = profile.get('first_name')
21-
user.last_name = profile.get('last_name')
22-
user.picture = profile.get('avatar_url')
23-
user.last_login_at = datetime.now()
20+
await update_profile(user, profile).save()
2421
await user.save()
2522
return strategy_response
2623

@@ -49,6 +46,17 @@ def get_profile(access_token: str) -> dict:
4946
return profile
5047

5148

49+
def update_profile(user: User, profile: dict) -> User:
50+
if user.first_name == None:
51+
user.first_name = profile.get('first_name')
52+
if user.last_name == None:
53+
user.last_name = profile.get('last_name')
54+
if user.picture == None:
55+
user.picture = profile.get('avatar_url')
56+
user.last_login_at = datetime.now()
57+
return user
58+
59+
5260
auth_backend_github = GithubAuthBackend(
5361
name="jwt-github",
5462
transport=bearer_transport,

fastapi/app/auth/google/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
GOOGLE_USERINFO_API = "https://www.googleapis.com/oauth2/v3/userinfo"
1+
GOOGLE_USERINFO_URL = "https://www.googleapis.com/oauth2/v3/userinfo"
22
GOOGLE_SCOPE_PROFILE = "https://www.googleapis.com/auth/userinfo.profile"
33
GOOGLE_SCOPE_EMAIL = "https://www.googleapis.com/auth/userinfo.email"

fastapi/app/auth/google/libs.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,15 @@
99
from ..exceptions import BadCredentialException
1010
from ..libs import bearer_transport, get_jwt_strategy
1111
from ..models import User
12-
from .constants import GOOGLE_USERINFO_API
12+
from .constants import GOOGLE_USERINFO_URL
1313

1414

1515
class GoogleAuthBackend(AuthenticationBackend):
1616
async def login(self, strategy: Strategy, user: User, response: Response) -> Any:
1717
strategy_response = await super().login(strategy, user, response)
1818
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()
2521
return strategy_response
2622

2723
def get_google_access_token(self, user: User) -> Optional[str]:
@@ -31,15 +27,26 @@ def get_google_access_token(self, user: User) -> Optional[str]:
3127
return None
3228

3329

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,
3632
params={'access_token': access_token})
3733
if not response.ok:
3834
raise BadCredentialException(
3935
'Failed to get user information from Google.')
4036
return response.json()
4137

4238

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+
4350
auth_backend_google = GoogleAuthBackend(
4451
name="jwt-google",
4552
transport=bearer_transport,

0 commit comments

Comments
 (0)