Я интегрирую свое веб-приложение с одним логином. Впервые, когда пользователь попадает на мою домашнюю страницу, я перенаправляю на один логин, и любое последующее перенаправление основывается либо на наличии сеанса, либо на нем нет.
Для каждого нового запроса проверка сеанса кажется пустой, и она продолжает идти к onelogin в цикле.
Примечание: все работает в моей локальной среде, так как это только HTTP-запрос. При развертывании в среде разработки AWS возникает проблема зацикливания на одном входе. Еще один момент после того, как он зацикливается на минуту или около того, затем внезапно страница, на которую должно произойти перенаправление, появляется немедленно.
Пролить немного света, чтобы выйти из этой проблемы. Дайте мне знать, если мне не хватает какой-либо информации для понимания этой проблемы.
PFB код ниже.
`
from flask_sslify import SSLify
application = Flask(__name__)
sslify = SSLify(application)
@app.before_request
def before_request():
if request.endpoint !='main' and 'samlNameId' not in session:
req = prepare_flask_request(request)
auth = init_saml_auth(req)
return redirect(auth.login())
@app.route('/', methods='GET,POST')
def main():
return index()
@app.route('/requestAccess', methods='GET,POST')
def request_access():
return render_template('request-access-form.html', apis=_apis, email_to=email_to)
def index():
req = prepare_flask_request(request)
auth = init_saml_auth(req)
try:
if 'slo' in request.args:
name_id = None
session_index = None
if 'samlNameId' in session:
name_id = session['samlNameId']
if 'samlSessionIndex' in session:
session_index = session['samlSessionIndex']
return redirect(auth.logout(name_id=name_id, session_index=session_index))
elif 'acs' in request.args:
auth.process_response()
errors = auth.get_errors()
if len(errors) == 0:
session['samlUserdata'] = auth.get_attributes()
session['samlNameId'] = auth.get_nameid()
session['samlSessionIndex'] = auth.get_session_index()
self_url = OneLogin_Saml2_Utils.get_self_url(req)
if 'RelayState' in request.form and self_url +"/" != request.form['RelayState']:
return redirect(auth.redirect_to(request.form['RelayState']))
return render_template('index.html')
else:
logger.error("Onelogin?acs returned with the following errors : " + ','.join(errors))
elif 'sls' in request.args:
logger.info("User with name %s and sessionIndex %s logged out successfully", session['samlNameId'],session['samlSessionIndex'])
dscb = lambda: session.clear()
url = auth.process_slo(delete_session_cb=dscb)
errors = auth.get_errors()
if len(errors) == 0:
if url is not None:
logger.info("Url returned from Onelogin ? sls" + url)
return redirect(url)
except Exception as e:
logger.error(e)
return redirect(auth.login())
return redirect(auth.login())
def init_saml_auth(req):
auth = OneLogin_Saml2_Auth(req, custom_base_path=app.config['SAML_PATH'])
return auth
def prepare_flask_request(request):
# If server is behind proxys or balancers use the HTTP_X_FORWARDED fields
url_data = urlparse(request.url)
prepared = {
'https': 'on' ,
'http_host': request.host,
'script_name': request.path,
'get_data': request.args.copy(),
'post_data': request.form.copy()
}
if url_data.port is not None:
prepared['server_port'] = url_data.port
return prepared
`