wiring up basic flask routing with server sessions back on filesystem

full_example
Mark Cotton 2023-07-13 23:00:37 -05:00
parent 425a8e5c02
commit 91b72ab9d9
6 changed files with 279 additions and 34 deletions

1
.gitignore vendored
View File

@ -7,3 +7,4 @@ my_settings.py
.lazy_login*
.ipynb_checkpoints/
.ipynb_checkpoints/*
flask_session/

View File

@ -138,6 +138,47 @@ class EagleEyev3():
'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):
"""
Obtains the base URL for the user.

85
app.py Normal file
View File

@ -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)

View File

@ -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)

131
templates/base.html Normal file
View File

@ -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 %}

21
templates/index.html Normal file
View File

@ -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 %}