google oauth2 with fastapi
async def __get_user_info_from_google_token(
request: RequestToken,
) -> UserInfoWithID:
request_body = {
"code": request.code,
"client_id": os.environ.get("GCP_CLIENT_ID"),
"client_secret": os.environ.get("GCP_CLIENT_SECRET"),
"redirect_uri": os.environ.get("GCP_REDIRECT_URI"),
"grant_type": "authorization_code",
}
async with aiohttp.ClientSession() as session:
async with session.post(
"https://oauth2.googleapis.com/token", data=request_body
) as response:
tokens = await response.json()
if "error" in tokens:
raise HTTPException(status_code=400, detail=tokens)
if "id_token" not in tokens:
raise HTTPException(status_code=400, detail="unknown error occured")
id_info = verify_oauth2_token(
id_token=tokens["id_token"],
request=google_requests.Request(),
audience=os.getenv("GCP_CLIENT_ID"),
)
id_info["id"] = id_info["sub"]
return UserInfoWithID(**id_info)
우리팀의 플로우는 front에서 code를 받아서 백엔드로 던지고 백엔드에서 code를 교환하는 방식을 사용. 그래서 일반적인 oauth2 플로우는 적용시키는데 오히려 복잡하다고 판단했고, 직접 요청하는걸 구현하기로 함. 요래요래 해주면 구글 oauth 성공~
fastapi cors
origins = [
"https://frontend.com"
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_methods=["GET", "POST"],
allow_headers=["*"]
)
