7
7
8
8
from backend .app .admin .crud .crud_user import user_dao
9
9
from backend .app .admin .schema .token import GetLoginToken
10
- from backend .app .admin .schema .user import RegisterUserParam
10
+ from backend .app .admin .schema .user import AddOAuth2UserParam
11
11
from backend .app .admin .service .login_log_service import login_log_service
12
12
from backend .common .enums import LoginLogStatusType , UserSocialType
13
- from backend .common .exception .errors import AuthorizationError
14
13
from backend .common .security import jwt
15
14
from backend .core .conf import settings
16
15
from backend .database .db import async_db_session
@@ -43,55 +42,65 @@ async def create_with_login(
43
42
:return:
44
43
"""
45
44
async with async_db_session .begin () as db :
46
- # 获取 OAuth2 平台用户信息
47
- social_id = user .get ('id' )
48
- social_nickname = user .get ('name' )
45
+ sid = user .get ('uuid' )
46
+ username = user .get ('username' )
47
+ nickname = user .get ('nickname' )
48
+ email = user .get ('email' )
49
+ avatar = user .get ('avatar_url' )
49
50
50
- social_username = user .get ('username' )
51
51
if social == UserSocialType .github :
52
- social_username = user .get ('login' )
52
+ sid = user .get ('id' )
53
+ username = user .get ('login' )
54
+ nickname = user .get ('name' )
53
55
54
- social_email = user .get ('email' )
55
56
if social == UserSocialType .linux_do :
56
- social_email = f'{ social_username } @linux.do'
57
- if not social_email :
58
- raise AuthorizationError (msg = f'授权失败,{ social .value } 账户未绑定邮箱' )
57
+ sid = user .get ('id' )
58
+ nickname = user .get ('name' )
59
59
60
- # 创建系统用户
61
- sys_user = await user_dao .check_email (db , social_email )
62
- if not sys_user :
63
- sys_user = await user_dao .get_by_username (db , social_username )
64
- if sys_user :
65
- social_username = f'{ social_username } #{ text_captcha (5 )} '
66
- sys_user = await user_dao .get_by_nickname (db , social_nickname )
67
- if sys_user :
68
- social_username = f'{ social_nickname } #{ text_captcha (5 )} '
69
- new_sys_user = RegisterUserParam (
70
- username = social_username , password = None , nickname = social_username , email = social_email
71
- )
72
- await user_dao .create (db , new_sys_user , social = True )
73
- await db .flush ()
74
- sys_user = await user_dao .check_email (db , social_email )
75
- # 绑定社交用户
76
- sys_user_id = sys_user .id
77
- user_social = await user_social_dao .get (db , sys_user_id , social .value )
60
+ sys_user = None
61
+ user_social = await user_social_dao .get_by_sid (db , str (sid ), str (social .value ))
78
62
if not user_social :
79
- new_user_social = CreateUserSocialParam (source = social .value , sid = str (social_id ), user_id = sys_user_id )
80
- await user_social_dao .create (db , new_user_social )
63
+ if email :
64
+ sys_user = await user_dao .check_email (db , email )
65
+
66
+ # 创建系统用户
67
+ if not sys_user :
68
+ while await user_dao .get_by_username (db , username ):
69
+ username = f'{ username } _{ text_captcha (5 )} '
70
+ new_sys_user = AddOAuth2UserParam (
71
+ username = username ,
72
+ password = '123456' , # 默认密码,可修改系统用户表进行默认密码检测并配合前端进行修改密码提示
73
+ nickname = nickname ,
74
+ email = email ,
75
+ avatar = avatar ,
76
+ )
77
+ await user_dao .add_by_oauth2 (db , new_sys_user )
78
+ await db .flush ()
79
+ sys_user = await user_dao .get_by_username (db , username )
80
+
81
+ # 绑定社交用户
82
+ new_user_social = CreateUserSocialParam (sid = str (sid ), source = social .value , user_id = sys_user .id )
83
+ await user_social_dao .create (db , new_user_social )
84
+
85
+ if not sys_user :
86
+ sys_user = await user_dao .get (db , user_social .user_id )
87
+ if avatar :
88
+ await user_dao .update_avatar (db , sys_user .id , avatar )
89
+
81
90
# 创建 token
82
91
access_token = await jwt .create_access_token (
83
- str (sys_user_id ),
92
+ str (sys_user . id ),
84
93
sys_user .is_multi_login ,
85
94
# extra info
86
95
username = sys_user .username ,
87
- nickname = sys_user .nickname ,
96
+ nickname = sys_user .nickname or f'# { text_captcha ( 5 ) } ' ,
88
97
last_login_time = timezone .t_str (timezone .now ()),
89
98
ip = request .state .ip ,
90
99
os = request .state .os ,
91
100
browser = request .state .browser ,
92
101
device = request .state .device ,
93
102
)
94
- refresh_token = await jwt .create_refresh_token (str (sys_user_id ), multi_login = sys_user .is_multi_login )
103
+ refresh_token = await jwt .create_refresh_token (str (sys_user . id ), multi_login = sys_user .is_multi_login )
95
104
await user_dao .update_login_time (db , sys_user .username )
96
105
await db .refresh (sys_user )
97
106
login_log = dict (
@@ -115,8 +124,8 @@ async def create_with_login(
115
124
data = GetLoginToken (
116
125
access_token = access_token .access_token ,
117
126
access_token_expire_time = access_token .access_token_expire_time ,
118
- user = sys_user , # type: ignore
119
127
session_uuid = access_token .session_uuid ,
128
+ user = sys_user , # type: ignore
120
129
)
121
130
return data
122
131
0 commit comments