Flask Login

This commit is contained in:
Johnny Gear 2026-01-09 17:45:03 -06:00
parent 849754ea4a
commit 4880ef61cf
3 changed files with 109 additions and 52 deletions

View file

@ -2,27 +2,56 @@ import sys
from pathlib import Path from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from flask import Flask, render_template, request, jsonify, redirect from flask import Flask, render_template, request, redirect, flash
from flask_login import LoginManager, UserMixin from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
import hashlib import hashlib
import hmac import hmac
import base64 import base64
from settings import FLASK_SECRET_KEY, TELEGRAM_API_TOKEN, TELEGRAM_BOT_NAME, TELEGRAM_BOT_DOMAIN from settings import FLASK_SECRET_KEY, TELEGRAM_API_TOKEN, TELEGRAM_BOT_NAME, TELEGRAM_BOT_DOMAIN
from db.queries import user_get
app = Flask(__name__) app = Flask(__name__)
app.secret_key = FLASK_SECRET_KEY app.secret_key = FLASK_SECRET_KEY
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "index"
class FlaskUser(UserMixin):
def __init__(self, db_user):
self.db_user = db_user
def get_id(self):
return self.db_user.telegram_username
@login_manager.user_loader
def load_user(user_id):
try:
db_user = user_get(user_id)
return FlaskUser(db_user)
except:
return None
@app.route('/') @app.route('/')
def index(): def index():
data = {'bot_name': TELEGRAM_BOT_NAME, 'bot_damin': TELEGRAM_BOT_DOMAIN} if not current_user.is_authenticated:
return render_template('index.html', data = data) data = {'bot_name': TELEGRAM_BOT_NAME, 'bot_damin': TELEGRAM_BOT_DOMAIN}
return render_template('index.html', data = data)
else:
return redirect('/dashboard')
@app.route('/dashboard') @app.route('/dashboard')
@login_required
def dashboard(): def dashboard():
return render_template('dashboard.html') return render_template('dashboard.html')
@app.route('/logout')
def logout():
logout_user()
return redirect('/')
def string_generator(data_incoming): def string_generator(data_incoming):
data = data_incoming.copy() data = data_incoming.copy()
del data['hash'] del data['hash']
@ -50,13 +79,18 @@ def login():
data_check_string_bytes = bytes(data_check_string, 'utf-8') data_check_string_bytes = bytes(data_check_string, 'utf-8')
hmac_string = hmac.new(secret_key_bytes, data_check_string_bytes, hashlib.sha256).hexdigest() hmac_string = hmac.new(secret_key_bytes, data_check_string_bytes, hashlib.sha256).hexdigest()
if hmac_string == tg_data['hash']: if hmac_string == tg_data['hash']:
return redirect('/dashboard') try:
db_user = user_get(tg_data['username'])
login_user(FlaskUser(db_user))
except:
flash("Login failed. Please try again.")
return redirect('/')
else:
flash("Login failed. Please try again.")
return redirect('/')
return jsonify({
'hmac_string': hmac_string, return redirect('/dashboard')
'tg_hash': tg_data['hash'],
'tg_data': tg_data
})
if __name__ == '__main__': if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True, port=8080) app.run(host='0.0.0.0', debug=True, port=8080)

View file

@ -5,30 +5,31 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS --> <title>Gear Orders Bot</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<title>Dashboard</title> <style>
body {
font-family: Arial;
}
h1 {
font-size: 18pt;
}
.grid {
display: grid;
justify-items: center;
align-content: center;
height: 80vh;
}
</style>
</head> </head>
<body class="w-100 h-100"> <body>
<div id="s_cover3" class="pt-5 pi-draggable text-white bg-primary"> <div class="grid">
<div class="container"> <h1>Dashboard</h1>
<div class="row"> <p>Successfuly logged in and the login verified</p>
<div class="col-md-12 text-md-left text-center align-self-center my-5">
<h1 class="display-1">Dashboard</h1>
<p class="lead">Successfuly logged in and the login verified</p>
</div>
</div>
</div>
</div> </div>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" type="text/css">
<link rel="stylesheet" href="theme.css" type="text/css">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
</body> </body>
</html> </html>

View file

@ -5,29 +5,51 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS --> <title>Gear Orders Bot</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<title>Hello, world!</title> <style>
body {
font-family: Arial;
}
h1 {
font-size: 18pt;
}
.grid {
display: grid;
justify-items: center;
align-content: center;
height: 80vh;
}
.flashes {
padding: 10px;
margin: 10px;
background-color: rgb(255, 193, 7);
color: rgb(51, 39, 1);
border: 1px solid rgb(51, 39, 1);
text-align: center;
p {
margin: 0;
}
}
</style>
</head> </head>
<div class="py-5 text-center opaque-overlay filter-gradient"> <body>
<div class="container py-5"> <div class="grid">
<div class="row"> <h1>Gear Orders Bot</h1>
<div class="col-md-12 text-white"> <script async src="https://telegram.org/js/telegram-widget.js?19" data-telegram-login="{{ data['bot_name'] }}" data-size="large" data-auth-url="{{ data['bot_domain'] }}/login" data-request-access="write"></script>
<h1 class="display-3 mb-4">Telegram Login</h1> {% with messages = get_flashed_messages() %}
<p class="lead mb-5">A simple telegram login using flask. The instructions can be found {% if messages %}
<br>mithun.co</p> <div class="flashes">
<script async src="https://telegram.org/js/telegram-widget.js?19" data-telegram-login="{{ data['bot_name'] }}" data-size="large" data-auth-url="{{ data['bot_domain'] }}/login" data-request-access="write"></script> {% for message in messages %}
</div> <p>{{ message }}</p>
</div> {% endfor %}
</div>
{% endif %}
{% endwith %}
</div> </div>
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
</body> </body>
</html> </html>