FastAPI와 OpenID Connect 인증 구현하기

개요

FastAPI는 Python으로 구축된 빠르고 현대적인 웹 프레임워크입니다. 이번 글에서는 FastAPI와 OpenID Connect(OIDC)을 함께 사용하여 웹 응용 프로그램에서 사용자 인증을 구현하는 방법을 알아보겠습니다.

OpenID Connect란?

OpenID Connect는 웹 애플리케이션에서 사용자 인증을 위한 프로토콜입니다. OIDC은 OAuth 2.0 프로토콜을 기반으로하며, 사용자를 인증하는 동시에 사용자의 개인 정보를 안전하게 가져올 수 있습니다.

FastAPI에 OIDC 통합하기

FastAPI에서 OIDC를 사용하기 위해 ‘authlib’라이브러리를 사용할 것입니다. 먼저 해당 라이브러리를 설치해야합니다.

pip install authlib

FastAPI에서 OIDC를 사용하려면 아래와 같이 OIDC 클라이언트를 설정해야합니다.

from fastapi import FastAPI
from authlib.integrations.starlette_client import OAuth

app = FastAPI()

oauth = OAuth(app)

oauth.register(
    name='my_oidc',
    server_metadata_url='https://openid.provider/.well-known/openid-configuration',
    client_id='YOUR_CLIENT_ID',
    client_secret='YOUR_CLIENT_SECRET',
    client_kwargs={'scope': 'openid profile'}
)

위의 예제에서는 ‘my_oidc’라는 이름으로 OIDC 클라이언트를 등록하였습니다. server_metadata_url은 OIDC 공급자의 메타데이터 URL을 나타내며, 클라이언트 정보를 설정하는 client_idclient_secret으로 OIDC 공급자와 통신합니다.

로그인 및 로그아웃을 처리하기 위해 FastAPI 엔드 포인트를 추가해야합니다. 아래는 해당 예제입니다.

from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2AuthorizationCodeBearer
from authlib.integrations.starlette_client import OAuthError

oauth2_scheme = OAuth2AuthorizationCodeBearer(
    authorizationUrl='https://openid.provider/authorize',
    tokenUrl='https://openid.provider/token',
)

@app.get('/login')
async def login():
    redirect_uri = 'http://your.app/callback'
    return await oauth.my_oidc.authorize_redirect(request, redirect_uri)

@app.get('/callback')
async def callback(code: str):
    redirect_uri = 'http://your.app/callback'
    try:
        token = await oauth.my_oidc.authorize_access_token(request, redirect_uri)
        userinfo = await oauth.my_oidc.parse_id_token(request, token)
        # 사용자 정보 처리
        return {'access_token': token['access_token'], 'userinfo': userinfo}
    except OAuthError as error:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)

@app.get('/logout')
async def logout(token: str = Depends(oauth2_scheme)):
    redirect_uri = 'http://your.app/callback'
    url = oauth.my_oidc.revocation_endpoint
    await oauth.my_oidc.logout(request, token=token, redirect_uri=redirect_uri)
    return {'message': 'Logged out'}

위의 코드에서는 /login 엔드포인트를 통해 사용자를 로그인 페이지로 리다이렉트하고, /callback 엔드포인트를 통해 인가 코드를 교환하여 액세스 토큰과 사용자 정보를 가져옵니다. /logout은 사용자를 로그아웃 처리하는 엔드포인트입니다.

결론

FastAPI와 OpenID Connect를 함께 사용하여 웹 애플리케이션의 사용자 인증을 손쉽게 구현할 수 있습니다. OIDC는 보안과 개인 정보 보호에 중점을 두며, FastAPI의 강력한 기능과 결합하여 최고 수준의 웹 애플리케이션을 개발할 수 있습니다.

#FastAPI #OpenIDConnect