1. User login and barebones account section added.

This commit is contained in:
2024-08-04 21:32:42 +01:00
parent 6ad86825ea
commit 514289bc21
2328 changed files with 292462 additions and 758 deletions

101
app.py
View File

@@ -22,11 +22,14 @@ from forms import Form_Contact, Form_Supplier, Form_Filters_Permutation, Form_Fi
from models.model_view_base import Model_View_Base
from models.model_view_home import Model_View_Home
from models.model_view_contact import Model_View_Contact
from models.model_view_services import Model_View_Services
from models.model_view_store_stock_item import Model_View_Store_Stock_Item
from models.model_view_supplier import Model_View_Supplier
from models.model_view_store_permutation import Model_View_Store_Permutation
from models.model_view_user import Model_View_User
from business_objects.product import Product, Product_Filters, Product_Permutation # , Product_Image_Filters, Resolution_Level_Enum
from business_objects.stock_item import Stock_Item, Stock_Item_Filters
from business_objects.user import User, User_Filters
from datastores.datastore_store import DataStore_Store
from helpers.helper_app import Helper_App
import lib.argument_validation as av
@@ -43,7 +46,9 @@ import os
import sys
from urllib.parse import quote_plus, urlencode
from authlib.integrations.flask_client import OAuth
from authlib.integrations.base_client import OAuthError
import jwt
from urllib.parse import quote, urlparse, parse_qs
# VARIABLE INSTANTIATION
@@ -131,8 +136,11 @@ oauth.register(
client_secret = app.ID_AUTH0_CLIENT_SECRET, # =env.get("AUTH0_CLIENT_SECRET"),
client_kwargs={
"scope": "openid profile email",
}
# server_metadata_url=f'https://{app.DOMAIN_AUTH0}/.well-known/openid-configuration'
},
server_metadata_url=f'https://{app.DOMAIN_AUTH0}/.well-known/openid-configuration',
api_base_url = f'https://{app.DOMAIN_AUTH0}',
authorize_url = f'https://{app.DOMAIN_AUTH0}/authorize',
access_token_url = f'https://{app.DOMAIN_AUTH0}/oauth/token',
)
# session[app.ID_TOKEN_USER] = {'userinfo': {'sub': ''}}
@@ -179,7 +187,7 @@ def home():
print('nips')
html_body = render_template('_page_home.html', model = model)
except Exception as e:
return str(e)
return jsonify(error=str(e)), 403
return html_body
@app.route('/contact', methods=['GET'])
@@ -216,12 +224,13 @@ def contact_post():
# @app.route('/public_html/services', methods=['GET', 'POST'])
def services():
try:
model = Model_View_Home(app, db)
model = Model_View_Services(app, db)
html_body = render_template('_page_services.html', model = model)
except Exception as e:
return jsonify(error=str(e)), 403
return html_body
# shop management
@app.route('/supplier', methods=['GET'])
def supplier():
@@ -369,24 +378,52 @@ def stock_save():
# User authentication
@app.route("/login")
@app.route("/login", methods=['POST'])
def login():
try:
data = request.json
except:
data = {}
callback_login = F'{Model_View_Base.HASH_CALLBACK_LOGIN}/{data.get(Model_View_Base.KEY_CALLBACK, Model_View_Base.HASH_PAGE_HOME)}'
uri_redirect = url_for(callback_login, _external=True)
print(f'data={data}')
# callback_login = F'{Model_View_Base.HASH_CALLBACK_LOGIN}{data.get(Model_View_Base.KEY_CALLBACK, Model_View_Base.HASH_PAGE_HOME)}'
# encoded_path = quote(data.get(Model_View_Base.KEY_CALLBACK, Model_View_Base.HASH_PAGE_HOME))
uri_redirect = url_for('login_callback', _external=True) # , subpath=encoded_path
# uri_redirect = f'{app.URL_HOST}/login_callback?subpath={data.get(Model_View_Base.KEY_CALLBACK, Model_View_Base.HASH_PAGE_HOME)}'
print(f'redirect uri: {uri_redirect}')
return oauth.auth0.authorize_redirect(
redirect_uri = uri_redirect
hash_callback = data.get(Model_View_Base.KEY_CALLBACK, Model_View_Base.HASH_PAGE_HOME)
print(f'hash_callback: {hash_callback}')
red = oauth.auth0.authorize_redirect(
redirect_uri = uri_redirect,
state = quote(hash_callback)
)
print(f'redirect: {red}')
headers = red.headers['Location']
print(f'headers: {headers}')
parsed_url = urlparse(headers)
query_params = parse_qs(parsed_url.query)
print(f"""
OAuth Authorize Redirect URL:
Base URL: {parsed_url.scheme}://{parsed_url.netloc}{parsed_url.path}
{parsed_url}
Query Parameters: {query_params}
""")
return jsonify({'Success': True, 'status': 'success', f'{Model_View_Base.KEY_CALLBACK}': headers})
@app.route("/login_callback/<path:subpath>")
def login_callback(subpath):
token = oauth.auth0.authorize_access_token()
@app.route("/login_callback") # <path:subpath>/<code>
def login_callback():
# print(f'code: {code}')
token = None
try:
token = oauth.auth0.authorize_access_token()
except Exception as e:
# Log the error for debugging
print(f"Error: {str(e)}")
session[app.ID_TOKEN_USER] = token
# import user id
print(f'str(type(token)) = {str(type(token))}')
print(f'token = {token}')
@@ -396,11 +433,37 @@ def login_callback(subpath):
id_user = userinfo.get('sub')
print(f'user ID: {id_user}')
datastore_store = DataStore_Store(app, db)
user = datastore_store.get_user_auth0()
user_filters = User_Filters.from_user(user)
users, errors = datastore_store.get_many_user(user_filters, user)
try:
user = users[0]
print('User logged in')
print(f'user ({str(type(user))}): {user}')
print(f'user key: {Model_View_Base.KEY_USER}')
user_json = user.to_json()
session[Model_View_Base.KEY_USER] = user_json
print(f'user stored on session')
except:
print(f'User not found: {user_filters}')
try:
hash_callback = token.get('hash_callback')
if hash_callback is None:
print('hash is none')
state = request.args.get('state')
print(f'state: {state}')
hash_callback = state # .get('hash_callback')
print(f'hash_callback: {hash_callback}')
except:
print("get hash callback failed")
# id_user = get_id_user()
# add user to database
# DataStore_Store(db, userinfo).add_new_user(id_user) # this is part of get basket - should occur on page load
return redirect(subpath)
print(f'user session: {session[Model_View_Base.KEY_USER]}')
return redirect(f'{app.URL_HOST}{hash_callback}')
@app.route("/logout")
def logout():
@@ -418,6 +481,16 @@ def logout():
)
@app.route("/user")
def user():
try:
model = Model_View_User(app, db)
html_body = render_template('_page_user.html', model = model)
except Exception as e:
return str(e)
return html_body
# snore
@app.route('/license', methods=['GET'])
def license():