일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- login crawling
- GenericGBQException
- 공분산
- BigQuery
- XAI
- grad-cam
- flask
- TensorFlow
- API
- hadoop
- GCP
- airflow subdag
- 상관관계
- UDF
- integrated gradient
- top_k
- API Gateway
- Airflow
- Retry
- session 유지
- youtube data
- subdag
- correlation
- chatGPT
- tensorflow text
- spark udf
- gather_nd
- requests
- Counterfactual Explanations
- 유튜브 API
- Today
- Total
데이터과학 삼학년
로그인 기능 추가 --> 다 만든 web에 로그인만 입히기 본문
WEB을 다 구성한 이후에 해당 WEB에 접근하기 위해 로그인을 붙일때 가장 쉽게 쓸 수 있는 방법은
바로 @app.before_request 이다.
해당 데커레이터는 모든 app이 실행되기 전에 가장 먼저 호출된다.
따라서 이 부분에 로그인을 붙이면 쉽게 해결 가능하다.
먼저 필자는 OKTA 인증 로그인을 붙였다.
OKTA 로 인증을 보내는 URL을 추가하여 해당 url로 redirect를 해준다.
이때 사용자가 맨처음 접근했던 url을 기억하고 있어야 로그인 이후 최초에 요청했던 페이지로 보내 줄 수 있기 때문에
request.url 을 이용하여 최초 요청했던 페이지를 글로벌 변수로 저장해 놓는다.
이후 okta 인증에서 로그인 후 redirect 해줄 URIS 주소를 가지고 서버가 클라이언트에게 보내줄 컨텐츠를 만든다.
가령 OKTA 설정에서 Login redirect URIs를 http://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)
'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 |