77
88from backend .app .admin .crud .crud_user import user_dao
99from 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
1111from backend .app .admin .service .login_log_service import login_log_service
1212from backend .common .enums import LoginLogStatusType , UserSocialType
13- from backend .common .exception .errors import AuthorizationError
1413from backend .common .security import jwt
1514from backend .core .conf import settings
1615from backend .database .db import async_db_session
@@ -43,55 +42,65 @@ async def create_with_login(
4342 :return:
4443 """
4544 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' )
4950
50- social_username = user .get ('username' )
5151 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' )
5355
54- social_email = user .get ('email' )
5556 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' )
5959
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 ))
7862 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+
8190 # 创建 token
8291 access_token = await jwt .create_access_token (
83- str (sys_user_id ),
92+ str (sys_user . id ),
8493 sys_user .is_multi_login ,
8594 # extra info
8695 username = sys_user .username ,
87- nickname = sys_user .nickname ,
96+ nickname = sys_user .nickname or f'# { text_captcha ( 5 ) } ' ,
8897 last_login_time = timezone .t_str (timezone .now ()),
8998 ip = request .state .ip ,
9099 os = request .state .os ,
91100 browser = request .state .browser ,
92101 device = request .state .device ,
93102 )
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 )
95104 await user_dao .update_login_time (db , sys_user .username )
96105 await db .refresh (sys_user )
97106 login_log = dict (
@@ -115,8 +124,8 @@ async def create_with_login(
115124 data = GetLoginToken (
116125 access_token = access_token .access_token ,
117126 access_token_expire_time = access_token .access_token_expire_time ,
118- user = sys_user , # type: ignore
119127 session_uuid = access_token .session_uuid ,
128+ user = sys_user , # type: ignore
120129 )
121130 return data
122131
0 commit comments