Skip to content

Commit 548c107

Browse files
committed
2 parents 34e6fba + 70866f5 commit 548c107

32 files changed

+625
-399
lines changed

.env.dev.example

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
ENV=dev
12
DB_DIALECT=mysql
23
DB_DRIVER=aiomysql
34
DB_HOST=127.0.0.1
@@ -10,7 +11,7 @@ DB_DATABASE=
1011
GOOGLE_CLIENT_ID=local
1112
GOOGLE_CLIENT_SECRET=local
1213

13-
FRONTEND_URL=http://localhost:3000
14+
FRONTEND_URL=https://wafflestudio.github.io/23-5-team9-web
1415

1516
ACCESS_TOKEN_SECRET=local_access_secret_please_change
1617
REFRESH_TOKEN_SECRET=local_refresh_secret_please_change

.env.local.example

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
ENV=local
2+
DB_DIALECT=mysql
3+
DB_DRIVER=aiomysql
4+
DB_HOST=localhost
5+
DB_PORT=3306
6+
DB_USER=
7+
DB_PASSWORD=
8+
DB_DATABASE=
9+
ACCESS_TOKEN_SECRET=
10+
REFRESH_TOKEN_SECRET=
11+
SESSION_SECRET=
12+
GOOGLE_CLIENT_ID=
13+
GOOGLE_CLIENT_SECRET=
14+
FRONTEND_URL=http://localhost:8080

.env.prod.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
ENV=prod
12
DB_DIALECT=mysql
23
DB_DRIVER=aiomysql
34
DB_HOST=

.github/workflows/publish-ghcr.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ jobs:
7272
AT_SECRET="${{ secrets.ACCESS_TOKEN_SECRET_DEV }}"
7373
RT_SECRET="${{ secrets.REFRESH_TOKEN_SECRET_DEV }}"
7474
SESS_SECRET="${{ secrets.SESSION_SECRET_DEV }}"
75+
ENV_VAR="dev"
7576
else
7677
ENV_FILE=".env.prod"
7778
DB_USER="${{ secrets.DB_USER_PROD }}"
@@ -81,9 +82,11 @@ jobs:
8182
AT_SECRET="${{ secrets.ACCESS_TOKEN_SECRET_PROD }}"
8283
RT_SECRET="${{ secrets.REFRESH_TOKEN_SECRET_PROD }}"
8384
SESS_SECRET="${{ secrets.SESSION_SECRET_PROD }}"
85+
ENV_VAR="prod"
8486
fi
8587
8688
cat > $ENV_FILE <<EOF
89+
ENV=$ENV_VAR
8790
DB_DIALECT=${{ secrets.DB_DIALECT }}
8891
DB_DRIVER=${{ secrets.DB_DRIVER }}
8992
DB_HOST=${{ secrets.DB_HOST }}

carrot/api.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
from carrot.app.auth.router import auth_router
44
from carrot.app.user.router import user_router
5-
from carrot.app.region.router import region_router
5+
from carrot.app.chat.router import chat_router
6+
# from carrot.app.chat.websocket import chat_ws_router
67

78
api_router = APIRouter()
89

910
api_router.include_router(auth_router, prefix="/auth", tags=["auth"])
1011
api_router.include_router(user_router, prefix="/user", tags=["user"])
11-
api_router.include_router(region_router, prefix="/region", tags=["region"])
12+
api_router.include_router(chat_router, prefix="/chat", tags=["chat"])
13+
# api_router.include_router(chat_ws_router, prefix="/ws", tags=["chat"])
14+

carrot/app/auth/router.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import Annotated
22

3-
from fastapi import APIRouter, Depends, Header, HTTPException, status
3+
from fastapi import APIRouter, Depends, Header, HTTPException, logger, status
44
from fastapi.responses import RedirectResponse
55
from starlette.requests import Request
66

@@ -9,6 +9,7 @@
99
from carrot.app.auth.schemas import TokenResponse, UserSigninRequest
1010
from carrot.app.auth.services import AuthService
1111
from carrot.app.auth.settings import AUTH_SETTINGS
12+
from carrot.settings import SETTINGS
1213

1314
auth_router = APIRouter()
1415

@@ -59,22 +60,40 @@ async def delete_token(
5960
google: StarletteOAuth2App = oauth.create_client("google") # type: ignore
6061

6162

62-
@auth_router.get("/oauth2/login/google", status_code=status.HTTP_200_OK)
63+
def get_redirect_uri(request: Request) -> str:
64+
uri_obj = request.url_for("receive_code")
65+
66+
if not SETTINGS.is_local:
67+
uri_obj = uri_obj.replace(scheme="https") # nginx changes scheme to https
68+
69+
return str(uri_obj)
70+
71+
72+
@auth_router.get("/oauth2/login/google", status_code=status.HTTP_307_TEMPORARY_REDIRECT)
6373
async def get_redirect_url(request: Request):
64-
redirect_uri = str(request.url_for("receive_code"))
74+
redirect_uri = get_redirect_uri(request)
6575
auth_data = await google.create_authorization_url(redirect_uri)
6676
google_auth_url = auth_data.get("url")
77+
78+
if google_auth_url is None:
79+
logger.logger.error("Google OAuth URL generation failed: URL is None")
80+
raise HTTPException(
81+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
82+
detail="구글 로그인 초기화에 실패했습니다.",
83+
)
84+
6785
await google.save_authorize_data(request, **auth_data)
6886
# print(f"DEBUG SESSION: {request.session}")
69-
return {"redirect_url": google_auth_url}
87+
return RedirectResponse(google_auth_url)
88+
# return {"redirect_url": google_auth_url}
7089

7190

7291
@auth_router.get("/oauth2/code/google")
7392
async def receive_code(
7493
request: Request,
7594
auth_service: Annotated[AuthService, Depends()],
7695
):
77-
redirect_uri = str(request.url_for("receive_code"))
96+
redirect_uri = get_redirect_uri(request)
7897

7998
try:
8099
token = await google.authorize_access_token(request, redirect_uri=redirect_uri)

carrot/app/auth/services.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ async def get_current_user_from_token(self, token: str, db: AsyncSession) -> Use
142142
username = claims.get("sub")
143143
if not username:
144144
raise UnauthenticatedException()
145-
146145
except (InvalidTokenException, JoseError):
147146
# 검증 함수에서 발생한 예외나 Jose 관련 에러를 인증 예외로 변환
148147
raise UnauthenticatedException()
@@ -153,5 +152,5 @@ async def get_current_user_from_token(self, token: str, db: AsyncSession) -> Use
153152

154153
if user is None:
155154
raise UnauthenticatedException()
156-
155+
157156
return user

carrot/app/auth/settings.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from urllib.parse import urlparse
12
from pydantic_settings import BaseSettings, SettingsConfigDict
23
from carrot.settings import SETTINGS
34

@@ -7,6 +8,11 @@ class AuthSettings(BaseSettings):
78
GOOGLE_CLIENT_SECRET: str
89
FRONTEND_URL: str
910

11+
@property
12+
def ALLOW_ORIGIN(self) -> str:
13+
parsed = urlparse(self.FRONTEND_URL)
14+
return f"{parsed.scheme}://{parsed.netloc}"
15+
1016
ACCESS_TOKEN_SECRET: str
1117
REFRESH_TOKEN_SECRET: str
1218
SESSION_SECRET: str

carrot/app/auth/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,4 @@ async def login_with_header_optional(
122122
if user.status != UserStatus.ACTIVE:
123123
raise OnboardingException()
124124

125-
return user
125+
return user

carrot/app/chat/chat_manager.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# from fastapi import WebSocket
2+
# from collections import defaultdict
3+
4+
# class ConnectionManager:
5+
# def __init__(self):
6+
# # 방 ID별로 연결된 소켓 리스트 관리 {room_id: [ws1, ws2, ...]}
7+
# self.active_connections: dict[str, list[WebSocket]] = defaultdict(list)
8+
9+
# async def connect(self, websocket: WebSocket, room_id: str):
10+
# await websocket.accept()
11+
# self.active_connections[room_id].append(websocket)
12+
13+
# def disconnect(self, websocket: WebSocket, room_id: str):
14+
# if websocket in self.active_connections[room_id]:
15+
# self.active_connections[room_id].remove(websocket)
16+
# if not self.active_connections[room_id]:
17+
# del self.active_connections[room_id]
18+
19+
# async def send_personal_message(self, message: dict, websocket: WebSocket):
20+
# await websocket.send_json(message)
21+
22+
# async def broadcast_to_room(self, room_id: str, message: dict):
23+
# # 해당 방에 접속 중인 모든 클라이언트에게 메시지 전송
24+
# for connection in self.active_connections.get(room_id, []):
25+
# await connection.send_json(message)
26+
27+
# manager = ConnectionManager()

0 commit comments

Comments
 (0)