wiring up basic flask routing with server sessions back on filesystem
parent
425a8e5c02
commit
91b72ab9d9
|
@ -7,3 +7,4 @@ my_settings.py
|
||||||
.lazy_login*
|
.lazy_login*
|
||||||
.ipynb_checkpoints/
|
.ipynb_checkpoints/
|
||||||
.ipynb_checkpoints/*
|
.ipynb_checkpoints/*
|
||||||
|
flask_session/
|
||||||
|
|
|
@ -138,6 +138,47 @@ class EagleEyev3():
|
||||||
'current_user': self.current_user
|
'current_user': self.current_user
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def logout(self):
|
||||||
|
"""
|
||||||
|
Revokes token.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict: Dictionary containing the success status, response HTTP status code, and data.
|
||||||
|
"""
|
||||||
|
url = "https://auth.eagleeyenetworks.com/oauth2/revoke"
|
||||||
|
|
||||||
|
payload = {
|
||||||
|
"token": self.access_token,
|
||||||
|
"token_type_hint": "access_token"
|
||||||
|
}
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"Authorization": f"Bearer {self.access_token}",
|
||||||
|
"Accept": "application/json",
|
||||||
|
"Content-type": "application/json"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Send a POST request to obtain the base URL
|
||||||
|
response = requests.post(url, json=payload, headers=headers)
|
||||||
|
response_json = response.json()
|
||||||
|
|
||||||
|
logging.info(f"{response.status_code} in logout")
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
success = True
|
||||||
|
else:
|
||||||
|
success = False
|
||||||
|
logging.info(f"call to logout: {response_json}")
|
||||||
|
|
||||||
|
self.access_token = None
|
||||||
|
self.refresh_token = None
|
||||||
|
|
||||||
|
return {
|
||||||
|
"success": success,
|
||||||
|
"response_http_status": response.status_code,
|
||||||
|
"data": response_json
|
||||||
|
}
|
||||||
|
|
||||||
def get_base_url(self, cascade=True):
|
def get_base_url(self, cascade=True):
|
||||||
"""
|
"""
|
||||||
Obtains the base URL for the user.
|
Obtains the base URL for the user.
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
|
||||||
|
import json, requests
|
||||||
|
from flask import Flask, request, session, render_template, redirect, url_for
|
||||||
|
from flask_session import Session
|
||||||
|
|
||||||
|
import logging
|
||||||
|
logger = logging.getLogger()
|
||||||
|
|
||||||
|
#logger.setLevel('DEBUG')
|
||||||
|
logger.setLevel('INFO')
|
||||||
|
#logger.setLevel('WARN')
|
||||||
|
#logger.setLevel('ERROR')
|
||||||
|
#logger.setLevel('CRITICAL')
|
||||||
|
|
||||||
|
from EagleEyev3 import EagleEyev3
|
||||||
|
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
SESSION_TYPE = 'filesystem'
|
||||||
|
app.config.from_object(__name__)
|
||||||
|
Session(app)
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def index():
|
||||||
|
|
||||||
|
if 'een' in session:
|
||||||
|
een = session['een']
|
||||||
|
else:
|
||||||
|
een = EagleEyev3()
|
||||||
|
session['een'] = een
|
||||||
|
|
||||||
|
# using current_user as a proxy for an established valid session
|
||||||
|
if een.access_token == None:
|
||||||
|
base_url = "https://auth.eagleeyenetworks.com/oauth2/authorize"
|
||||||
|
path_url = f"?client_id={een.client_id}&response_type=code&scope=vms.all&redirect_uri={een.redirect_uri}"
|
||||||
|
return redirect(f"{base_url}{path_url}")
|
||||||
|
|
||||||
|
# call this to check if session is actually valid
|
||||||
|
check = een.get_current_user()
|
||||||
|
if 'success' not in check or check['success'] == False:
|
||||||
|
base_url = "https://auth.eagleeyenetworks.com/oauth2/authorize"
|
||||||
|
path_url = f"?client_id={een.client_id}&response_type=code&scope=vms.all&redirect_uri={een.redirect_uri}"
|
||||||
|
return redirect(f"{base_url}{path_url}")
|
||||||
|
else:
|
||||||
|
logging.info(f"{check['success']} - check get_current_user")
|
||||||
|
|
||||||
|
|
||||||
|
values = {
|
||||||
|
"current_user": een.current_user
|
||||||
|
}
|
||||||
|
|
||||||
|
return render_template('index.html', template_values=values)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/login_callback')
|
||||||
|
def login_callback():
|
||||||
|
# This is getting the ?code= querystring value from the HTTP request.
|
||||||
|
code = request.args.get('code')
|
||||||
|
|
||||||
|
if 'een' in session:
|
||||||
|
een = session['een']
|
||||||
|
else:
|
||||||
|
een = EagleEyev3()
|
||||||
|
|
||||||
|
|
||||||
|
if (code):
|
||||||
|
# use the include code parameter to complete login process
|
||||||
|
oauth_object = een.login_tokens(code)
|
||||||
|
|
||||||
|
|
||||||
|
return redirect(url_for('index'))
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/logout')
|
||||||
|
def logout():
|
||||||
|
if 'een' in session:
|
||||||
|
een = session['een']
|
||||||
|
een.logout()
|
||||||
|
|
||||||
|
return redirect(url_for('index'))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(host=een.server_host, port=een.server_port)
|
34
server.py
34
server.py
|
@ -1,34 +0,0 @@
|
||||||
|
|
||||||
import json, requests
|
|
||||||
from flask import Flask, request
|
|
||||||
from EagleEyev3 import EagleEyev3
|
|
||||||
|
|
||||||
een = EagleEyev3()
|
|
||||||
|
|
||||||
app = Flask(__name__)
|
|
||||||
|
|
||||||
@app.route('/')
|
|
||||||
def index():
|
|
||||||
|
|
||||||
|
|
||||||
base_url = "https://auth.eagleeyenetworks.com/oauth2/authorize"
|
|
||||||
path_url = f"?client_id={een.client_id}&response_type=code&scope=vms.all&redirect_uri={een.redirect_uri}"
|
|
||||||
|
|
||||||
return f"<a href='{base_url}{path_url}'>Login with Eagle Eye Networks</a>"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@app.route('/login_callback')
|
|
||||||
def login_callback():
|
|
||||||
# This is getting the ?code= querystring value from the HTTP request.
|
|
||||||
code = request.args.get('code')
|
|
||||||
|
|
||||||
if (code):
|
|
||||||
# use the include code parameter to complete login process
|
|
||||||
oauth_object = een.login_tokens(code)
|
|
||||||
return f"Hello {een.current_user['firstName']} {een.current_user['lastName']}"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
app.run(host=een.server_host, port=een.server_port)
|
|
|
@ -0,0 +1,131 @@
|
||||||
|
|
||||||
|
{% if "X-PJAX" not in request.headers %}
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="author" content="">
|
||||||
|
|
||||||
|
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
|
||||||
|
{% block title %}
|
||||||
|
<title>classifier.een.cloud</title>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
<!-- Bootstrap core CSS -->
|
||||||
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="//cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css">
|
||||||
|
<link href="/static/dataTables.bootstrap4.min.css">
|
||||||
|
|
||||||
|
<!-- Custom styles for this template -->
|
||||||
|
<!-- <link href="album.css" rel="stylesheet">
|
||||||
|
<link href="custom.css" rel="stylesheet"> -->
|
||||||
|
<link href="/static/style.css" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- self-hosted fontawesome -->
|
||||||
|
<link href="/static/css/all.css" rel="stylesheet">
|
||||||
|
|
||||||
|
{% block style %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<header>
|
||||||
|
|
||||||
|
|
||||||
|
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
|
|
||||||
|
|
||||||
|
<div class="collapse navbar-collapse">
|
||||||
|
<ul class="navbar-nav mr-auto mt-2 mt-lg-0">
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a href="/" class="navbar-brand d-flex align-items-center">
|
||||||
|
<strong><small>status</small>.mcotton.space</strong>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
<span class="navbar-text">
|
||||||
|
{% block current_user %}
|
||||||
|
{% endblock %}
|
||||||
|
</span>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</header>
|
||||||
|
|
||||||
|
|
||||||
|
<main role="main">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% if "X-PJAX" not in request.headers %}
|
||||||
|
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer class="text-muted">
|
||||||
|
<div class="container">
|
||||||
|
<p class="float-right">
|
||||||
|
</p>
|
||||||
|
<p></p>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- Bootstrap core JavaScript
|
||||||
|
================================================== -->
|
||||||
|
<!-- Placed at the end of the document so the pages load faster -->
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
|
||||||
|
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
|
||||||
|
|
||||||
|
<script src="//cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
|
||||||
|
<script src="https://cdn.datatables.net/1.10.19/js/dataTables.bootstrap4.min.js"></script>
|
||||||
|
<script src="/static/js/jquery.pjax.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
|
||||||
|
$('#user_mode_toggle').on('click', function(event) {
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: '/api/v1/user_mode/toggle',
|
||||||
|
dataType: "text",
|
||||||
|
contentType : 'application/json',
|
||||||
|
success: function(data) {
|
||||||
|
//$('#labelModal-add').text('Saved');
|
||||||
|
//$('#labelModal').modal('hide');
|
||||||
|
location.reload();
|
||||||
|
},
|
||||||
|
error: function(data) {
|
||||||
|
console.log(data)
|
||||||
|
$('#labelModal-add').text('Failed');
|
||||||
|
//$('#labelModal').modal('hide');
|
||||||
|
//location.reload();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
{% block script %}
|
||||||
|
|
||||||
|
{% endblock%}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,21 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block style %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block current_user %}
|
||||||
|
{{ template_values['current_user']['email'] }}
|
||||||
|
<a href="/logout" tabindex="-1">Logout</a>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
|
||||||
|
<div class="container text-center">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 offset-3">
|
||||||
|
<h1>Hello {{ template_values['current_user']['firstName'] }} {{ template_values['current_user']['lastName'] }}</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
Loading…
Reference in New Issue