Atualizar app/app.py
This commit is contained in:
+49
@@ -129,10 +129,59 @@ def require_capability(cap):
|
|||||||
# AUTH
|
# AUTH
|
||||||
# ================
|
# ================
|
||||||
|
|
||||||
|
import pyotp, base64, os
|
||||||
|
|
||||||
|
@app.route("/auth/enable_2fa", methods=["POST"])
|
||||||
|
@login_required
|
||||||
|
def enable_2fa():
|
||||||
|
db = SessionLocal()
|
||||||
|
if app.config["AUTH_MODE"] == "oauth":
|
||||||
|
email = session["user"]["email"]
|
||||||
|
else:
|
||||||
|
email = session["db_user"]["email"]
|
||||||
|
|
||||||
|
u = db.query(User).filter_by(email=email).first()
|
||||||
|
secret = base64.b32encode(os.urandom(10)).decode("utf-8")
|
||||||
|
u.totp_secret = secret
|
||||||
|
u.twofa_enabled = True
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
|
||||||
|
# Você mostra esse secret como QR code no frontend (otpauth:// URI)
|
||||||
|
return jsonify({"secret": secret})
|
||||||
|
|
||||||
|
|
||||||
@app.route("/auth_mode")
|
@app.route("/auth_mode")
|
||||||
def auth_mode():
|
def auth_mode():
|
||||||
return jsonify({"mode": app.config["AUTH_MODE"]})
|
return jsonify({"mode": app.config["AUTH_MODE"]})
|
||||||
|
|
||||||
|
@app.route("/auth/login", methods=["GET", "POST"])
|
||||||
|
def db_login():
|
||||||
|
if request.method == "GET":
|
||||||
|
return send_file("/srv/auth/login.html")
|
||||||
|
|
||||||
|
email = request.form.get("email")
|
||||||
|
password = request.form.get("password")
|
||||||
|
token = request.form.get("token") # código 2FA
|
||||||
|
|
||||||
|
db = SessionLocal()
|
||||||
|
user = db.query(User).filter_by(email=email).first()
|
||||||
|
|
||||||
|
if not user or user.password != password:
|
||||||
|
db.close()
|
||||||
|
return jsonify({"error": "Invalid credentials"}), 401
|
||||||
|
|
||||||
|
if user.twofa_enabled:
|
||||||
|
totp = pyotp.TOTP(user.totp_secret)
|
||||||
|
if not totp.verify(token):
|
||||||
|
db.close()
|
||||||
|
return jsonify({"error": "Invalid 2FA token"}), 401
|
||||||
|
|
||||||
|
db.close()
|
||||||
|
session["db_user"] = {"email": user.email, "name": user.name, "role": user.role}
|
||||||
|
return redirect("/")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
oauth = OAuth(app)
|
oauth = OAuth(app)
|
||||||
google = oauth.register(
|
google = oauth.register(
|
||||||
|
|||||||
Reference in New Issue
Block a user