FlaskAppBuilder + Github OAuth
아래는 Flask-AppBuilder(이하 FAB) 애플리케이션에서 GitHub OAuth로 로그인(인가) 연동을 구현하는 간단한 예시 코드임.
전제 조건은 다음과 같음.
GitHub에서 OAuth App을 등록하여 Client ID, Client Secret을 발급받아야 함.
등록 시 “Authorization callback URL”에 본인 앱의 콜백 경로를 정확히 설정해야 함.
예를 들면, https://example.com/oauth-authorized/github (FAB 기본 콜백 패턴).
아래 코드 예시는 최소 구성임.
실제 서비스에 적용 시 데이터베이스, 권한 그룹(Role) 설정, HTTPS 구성, SECRET_KEY 보안 등 추가 설정이 필요함.
Github OAuth App 등록
GitHub에서 Developer settings → OAuth Apps 메뉴로 이동함.
New OAuth App 버튼을 눌러 아래 정보를 입력하고 앱을 생성함.
Homepage URL: http://localhost:5000
Authorization callback URL: http://localhost:5000/oauth-authorized/github
생성 후 발급받은 Client ID, Client Secret을 안전하게 보관함.
Flask-AppBuilder 프로젝트 구조
my_app/
├─ app.py # Flask 메인 스크립트
├─ config.py # FAB 설정, DB 설정 등
├─ requirements.txt
└─ ...
config.py 설정 예시
import os
from flask_appbuilder.security.manager import AUTH_OAUTH
basedir = os.path.abspath(os.path.dirname(__file__))
# ----------------------------------------------------------------------------
# 기본 Flask 설정
# ----------------------------------------------------------------------------
SECRET_KEY = os.urandom(24)
SQLALCHEMY_DATABASE_URI = f'sqlite:///{os.path.join(basedir, "app.db")}'
CSRF_ENABLED = True
# ----------------------------------------------------------------------------
# Flask-AppBuilder 보안/인증 설정
# ----------------------------------------------------------------------------
AUTH_TYPE = AUTH_OAUTH
OAUTH_PROVIDERS = [
{
'name': 'github',
'icon': 'fa-github', # 로그인 버튼 아이콘(FontAwesome)
'token_key': 'access_token', # 토큰 파라미터명
'remote_app': {
'client_id': 'YOUR_GITHUB_CLIENT_ID',
'client_secret': 'YOUR_GITHUB_CLIENT_SECRET',
'api_base_url': 'https://api.github.com/',
'access_token_url': 'https://github.com/login/oauth/access_token',
'authorize_url': 'https://github.com/login/oauth/authorize',
'request_token_params': {
'scope': 'user:email' # GitHub에서 가져올 권한 범위
}
}
}
]
주의사항은 다음과 같음.
실제 서비스 환경에서는 SECRET_KEY를 하드코딩하지 않고, 환경변수나 안전한 Vault 등에 보관하는 것을 권장함.
GitHub OAuth App 등록 시, 콜백 URL이 정확히 일치해야 함.
FAB의 기본 콜백 경로는 /oauth-authorized/<provider_name> 형태임.
app.py (Flask + FAB 초기화)
from flask import Flask
from flask_appbuilder import AppBuilder, SQLA
from config import SQLALCHEMY_DATABASE_URI, CSRF_ENABLED, SECRET_KEY
# Flask 인스턴스 생성
app = Flask(__name__)
app.config.from_object('config')
# DB 및 FAB 초기화
db = SQLA(app)
appbuilder = AppBuilder(app, db.session)
# 필요 시, 직접 뷰(모델뷰/직접 구현) 등록
# from .views import MyView
# appbuilder.add_view(MyView, "My View", icon="fa-folder", category="My Category")
if __name__ == "__main__":
# 초기 DB 생성 (최초 1회 필요)
with app.app_context():
db.create_all()
app.run(host="0.0.0.0", port=5000, debug=True)
db.create_all()을 통해 초기 테이블(사용자, 롤(Role) 등)을 생성함.
브라우저에서 http://localhost:5000/login/으로 접속하면 FAB의 로그인 화면을 볼 수 있음.
GitHub OAuth 로그인 버튼이 표시됨.
실행 및 테스트
(가상환경 사용 시) pip install flask flask_appbuilder 등 필요한 패키지를 설치함.
python app.py 실행 (기본 포트 5000).
브라우저로 http://localhost:5000/login/ 접속.
Sign in with: github 버튼 클릭 시 GitHub 권한 부여 창으로 리다이렉트됨.
GitHub 계정으로 로그인 후 권한을 허용하면, FAB가 Access Token을 받고 사용자 정보를 조회하여 앱 내 사용자로 등록함.
추가 참고 사항
1. 사용자 정보 매핑
기본적으로 Flask-AppBuilder는 OAuth Provider에서 받은 이메일, 프로필 정보를 사용해 FAB User DB에 사용자 레코드를 생성함.
필요 시 사용자 모델과 매핑 로직을 커스터마이징할 수 있음.
2. Role(역할) 자동 할당
AUTH_ROLES_MAPPING과 AUTH_USER_REGISTRATION_ROLE 등을 사용하면, OAuth 신규 가입 사용자에게 특정 FAB Role을 자동 부여할 수 있음.
3. HTTPS 및 배포
실제 운영 환경에서는 HTTPS(TLS/SSL) 설정이 필수임.
GitHub OAuth App도 callback URL에서 HTTPS를 권장함.
4. 보안
OAuth App의 Client Secret은 서버 사이드에서만 사용해야 하며, 코드 리포지토리에 노출되지 않도록 유의해야함.
SECRET_KEY, DB 비밀번호, API Key 등 민감한 정보는 환경 변수나 별도 보안 Vault로 분리하여 관리하는 것을 권장함.
정리
위와 같이 설정하면, Flask-AppBuilder 기반 애플리케이션에서 GitHub OAuth를 통해 사용자가 로그인할 수 있는 기본 골격을 구성할 수 있음.
필요에 따라 Roles, Security Manager 커스터마이징, OpenID Connect 등 더 확장된 인증/인가 옵션을 적용 가능.
'Operating System > Kubernetes' 카테고리의 다른 글
[Kubernetes] 컨트롤플레인 개념 (1) | 2025.01.04 |
---|---|
[Kubernetes] Flask의 AUTH_ROLES_MAPPING 및 AUTH_USER_REGISTRATION_ROLE (0) | 2025.01.02 |
[Kubernetes] OAuth 개념 (0) | 2025.01.02 |
[Kubernetes] 롤링 업데이트 개념 (0) | 2025.01.01 |
[Kubernetes] 쿠버네티스의 앤드포인트 (0) | 2025.01.01 |