1+ import json
2+ import uuid
3+
14from typing import Annotated
25
36from fastapi import APIRouter , BackgroundTasks , Depends , Response
811from backend .common .response .response_schema import ResponseSchemaModel , response_base
912from backend .core .conf import settings
1013from backend .database .db import CurrentSessionTransaction
11- from backend .plugin .oauth2 .enums import UserSocialType
14+ from backend .database .redis import redis_client
15+ from backend .plugin .oauth2 .enums import UserSocialAuthType , UserSocialType
1216from backend .plugin .oauth2 .service .oauth2_service import oauth2_service
1317
1418router = APIRouter ()
1822
1923@router .get ('' , summary = '获取 LinuxDo 授权链接' )
2024async def get_linux_do_oauth2_url () -> ResponseSchemaModel [str ]:
21- auth_url = await linux_do_client .get_authorization_url (redirect_uri = settings .OAUTH2_LINUX_DO_REDIRECT_URI )
25+ state = str (uuid .uuid4 ())
26+
27+ await redis_client .setex (
28+ f'{ settings .OAUTH2_STATE_REDIS_PREFIX } :{ state } ' ,
29+ settings .OAUTH2_STATE_EXPIRE_SECONDS ,
30+ json .dumps ({'type' : UserSocialAuthType .login .value }),
31+ )
32+
33+ auth_url = await linux_do_client .get_authorization_url (
34+ redirect_uri = settings .OAUTH2_LINUX_DO_REDIRECT_URI , state = state
35+ )
2236 return response_base .success (data = auth_url )
2337
2438
@@ -37,16 +51,23 @@ async def linux_do_oauth2_callback( # noqa: ANN201
3751 Depends (FastAPIOAuth20 (linux_do_client , redirect_uri = settings .OAUTH2_LINUX_DO_REDIRECT_URI )),
3852 ],
3953):
40- token_data , _state = oauth2
54+ token_data , state = oauth2
4155 access_token = token_data ['access_token' ]
4256 user = await linux_do_client .get_userinfo (access_token )
43- data = await oauth2_service .create_with_login (
57+ data = await oauth2_service .login_or_binding (
4458 db = db ,
4559 response = response ,
4660 background_tasks = background_tasks ,
4761 user = user ,
4862 social = UserSocialType .linux_do ,
63+ state = state ,
4964 )
65+
66+ # 绑定流程
67+ if data is None :
68+ return RedirectResponse (url = settings .OAUTH2_FRONTEND_BINDING_REDIRECT_URI )
69+
70+ # 登录流程
5071 return RedirectResponse (
51- url = f'{ settings .OAUTH2_FRONTEND_REDIRECT_URI } ?access_token={ data .access_token } &session_uuid={ data .session_uuid } ' ,
72+ url = f'{ settings .OAUTH2_FRONTEND_LOGIN_REDIRECT_URI } ?access_token={ data .access_token } &session_uuid={ data .session_uuid } ' ,
5273 )
0 commit comments