[python] Authlib를 사용하여 애플리케이션에 여러 인증 제공 업체를 지원한 로그인 기능을 추가하는 방법은?

Authlib는 Python 기반의 인증 라이브러리로, 다양한 인증 제공 업체(예: Google, Facebook, Twitter 등)의 로그인 기능을 간편하게 구현할 수 있습니다. 이번 포스트에서는 Authlib를 사용하여 애플리케이션에 여러 인증 제공 업체를 지원한 로그인 기능을 추가하는 방법에 대해 알아보겠습니다.

1. Authlib 설치하기

먼저, Authlib를 설치해야 합니다. 터미널에서 다음 명령을 실행하여 Authlib를 설치하세요:

$ pip install authlib

2. 인증 제공 업체 등록하기

Authlib를 사용하여 로그인 기능을 구현하려면 각 인증 제공 업체에 대한 개발자 계정을 먼저 생성해야 합니다. 예를 들어, Google과 Facebook의 인증 제공 업체를 사용하려면 Google 및 Facebook 개발자 포털에서 애플리케이션을 등록해야 합니다. 등록을 완료하면 각각의 인증 제공 업체로부터 클라이언트 ID와 클라이언트 시크릿을 발급받게 됩니다.

3. Flask 애플리케이션 설정하기

다음으로, Flask 애플리케이션에 Authlib를 설정해야 합니다. config.py라는 파일을 생성하고 다음 코드를 추가하세요:

# config.py

import os

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'your-secret-key'

    AUTHLIB_OAUTH_CLIENTS = {
        'google': {
            'client_id': 'your-google-client-id',
            'client_secret': 'your-google-client-secret',
        },
        'facebook': {
            'client_id': 'your-facebook-client-id',
            'client_secret': 'your-facebook-client-secret',
        }
    }

위 코드에서는 AUTHLIB_OAUTH_CLIENTS 딕셔너리를 사용하여 각 인증 제공 업체의 클라이언트 ID와 클라이언트 시크릿을 설정합니다. your-google-client-idyour-google-client-secret에는 Google 인증 제공 업체에서 발급받은 값을 입력하고, your-facebook-client-idyour-facebook-client-secret에는 Facebook 인증 제공 업체에서 발급받은 값을 입력해야 합니다.

4. 로그인 기능 추가하기

이제, 실제로 로그인 기능을 추가해보겠습니다. Flask 애플리케이션에서 로그인 라우트를 생성하고, 각 인증 제공 업체의 로그인 URL로 리다이렉션합니다. 사용자가 인증을 완료하면 Authlib가 액세스 토큰을 받아올 수 있습니다. 다음은 예시 코드입니다:

# app.py

from flask import Flask, redirect, url_for, session
from authlib.integrations.flask_client import OAuth

app = Flask(__name__)
app.config.from_object('config')

oauth = OAuth(app)
oauth.register(
    name='google',
    client_id=app.config['AUTHLIB_OAUTH_CLIENTS']['google']['client_id'],
    client_secret=app.config['AUTHLIB_OAUTH_CLIENTS']['google']['client_secret'],
    authorize_url='https://accounts.google.com/o/oauth2/v2/auth',
    access_token_url='https://www.googleapis.com/oauth2/v4/token',
    api_base_url='https://www.googleapis.com/oauth2/v2/',
    client_kwargs={'scope': 'openid email profile'}
)
oauth.register(
    name='facebook',
    client_id=app.config['AUTHLIB_OAUTH_CLIENTS']['facebook']['client_id'],
    client_secret=app.config['AUTHLIB_OAUTH_CLIENTS']['facebook']['client_secret'],
    authorize_url='https://www.facebook.com/v12.0/dialog/oauth',
    access_token_url='https://graph.facebook.com/v12.0/oauth/access_token',
    api_base_url='https://graph.facebook.com/v12.0/'
)

@app.route('/login/<provider>')
def login(provider):
    redirect_uri = url_for('authorize', provider=provider, _external=True)
    return oauth.create_client(provider).authorize_redirect(redirect_uri)

@app.route('/authorize/<provider>')
def authorize(provider):
    token = oauth.create_client(provider).authorize_access_token()
    session['token'] = token
    # 로그인 성공 후 처리할 코드 작성

if __name__ == '__main__':
    app.run()

위 코드에서는 Flask 애플리케이션에 /login/<provider>/authorize/<provider> 로그인 라우트를 생성하고, oauth.create_client(provider)를 사용하여 리다이렉션 및 액세스 토큰 요청을 수행합니다. 로그인이 성공하면 token 변수에 액세스 토큰이 저장되고, 이후 필요에 따라 추가적인 코드를 작성하여 로그인 성공 후의 동작을 정의할 수 있습니다.

결론

이제, Authlib를 사용하여 애플리케이션에 다양한 인증 제공 업체를 지원한 로그인 기능을 추가하는 방법을 알아보았습니다. 이를 통해 사용자가 자신의 Google, Facebook 등의 계정으로 로그인할 수 있게 되었습니다. Authlib를 통해 복잡한 인증 과정을 단순화하고, 개발자는 더욱 용이하게 로그인 기능을 구현할 수 있습니다.

참고 자료: