데이터과학 삼학년

로그인 기능 추가 --> 다 만든 web에 로그인만 입히기 본문

Web

로그인 기능 추가 --> 다 만든 web에 로그인만 입히기

Dan-k 2020. 3. 6. 19:14
반응형

WEB을 다 구성한 이후에 해당 WEB에 접근하기 위해 로그인을 붙일때 가장 쉽게 쓸 수 있는 방법은

 

바로 @app.before_request 이다.

해당 데커레이터는 모든 app이 실행되기 전에 가장 먼저 호출된다.

따라서 이 부분에 로그인을 붙이면 쉽게 해결 가능하다.

 

먼저 필자는 OKTA 인증 로그인을 붙였다.

OKTA 로 인증을 보내는 URL을 추가하여 해당 url로 redirect를 해준다.

 

이때 사용자가 맨처음 접근했던 url을 기억하고 있어야 로그인 이후 최초에 요청했던 페이지로 보내 줄 수 있기 때문에

request.url 을 이용하여 최초 요청했던 페이지를 글로벌 변수로 저장해 놓는다.

 

이후 okta 인증에서 로그인 후 redirect 해줄 URIS 주소를 가지고 서버가 클라이언트에게 보내줄 컨텐츠를 만든다.

가령 OKTA 설정에서 Login redirect URIshttp://localhost/callbak 으로 설정하였다면

 

flask 서버에서

@app.route('callback')

def after_login():

    return 'Hello'

 

를 이용해 hello를 표출하던지 혹은 최초 요청했던 페이지로 내보내주기 위해서

AUTH_URL = '어쩌고 저쩌고 okta 인증을 보내기 위한 url 주소'

@app.before_request 

def verify_session(): 

    global url 

    endpoint = request.endpoint 

    if endpoint != 'after_login': 

        url = request.url 

        print('before_request url :', url) 

        return redirect(AUTH_URL) 

    else: 

        token = session.get('token', None) 

        user = session.get('user', None) 

        print('Logged in as %s' % user) 

@app.route('/callback', methods=['GET', 'POST'])           

def login_callback(): 

    if request.method == 'POST': 

        print('url :', url) 

        return redirect(url) 

        

 

작성해 주면

로그인 후 최초에 요청했던 URL로 보내주게 된다!!!

 

후...힘들었다....

 

코드

from flask import Flask, render_template, request, redirect, url_for, jsonify, session
from flask_caching import Cache

import os


app = Flask(__name__)

config = {
    "DEBUG": True,  # some Flask specific configs
    "CACHE_TYPE": "simple",  # Flask-Caching related configs
    "CACHE_DEFAULT_TIMEOUT": 300
}


app.config.from_mapping(config)
cache = Cache(app)


random_secret_key = os.urandom(16)
print('key: ', random_secret_key)
app.secret_key = random_secret_key

# AUTH
AUTH_URL = "https://sso.ddd.io/app/jk/sso/saml"

# APP 실행시 제일 먼저 호출됨
@app.before_request
def verify_session():
    global url
    endpoint = request.endpoint
    query_string = request.query_string
    print('endpoint :', endpoint)
    print('query_string :', query_string)
    print('session :', session)
    
    make_session_permanent()

    # if token is valid:
    if 'token' not in session and endpoint != 'login_callback':
        url = request.url
        print('before_request url :', url)
        return redirect(AUTH_URL)
    else:
        token = session.get('token', None)
        user = session.get('user', None)
        print('Logged in as %s' % user)


def make_session_permanent():
    session.permanent = True
    app.permanent_session_lifetime = timedelta(minutes=5)


@app.route("/login/callback", methods=['GET', 'POST'])          
def login_callback():
    global url
    if request.method == 'POST':
        header = str(request.headers)
        body = str(request.values)
		referrer = request.headers.get("Referer")
        
        print('header: ', header)
        print('body: ', body)
        print('url :', url)
        print('referer :', referrer)
        return redirect(url)
        
        
  #### 이 아래 부턴 원래 만들어 놓은 코드 작성 ###
@app.route('/')
def hello():
    return '<h3> Hello world </h3>'
    
@cache.memoize(60)
def get_html(worldno, feature):
    plot = create_figure(worldno, feature)

    script, div = components(plot)
    js_resources = INLINE.render_js()
    css_resources = INLINE.render_css()

    html = render_template("figure.html",
                           plot_script=script,
                           plot_div=div,
                           js_resources=js_resources,
                           css_resources=css_resources,
                           worldno=worldno,
                           feature=feature
                           )
    return encode_utf8(html)
    
728x90
반응형
LIST

'Web' 카테고리의 다른 글

NGINX 504 Gateway Time-out 에러와 해결방법  (0) 2020.03.11
request.values 로 body를 분석( base64 encode --> decode)  (0) 2020.03.09
flask request  (0) 2020.03.05
flask http 요청 핸들러  (0) 2020.03.05
SSO (Single Sign On)  (0) 2020.02.11
Comments