File size: 2,935 Bytes
aa70399 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
from flask import Blueprint, render_template, request, redirect, url_for
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import login_user, logout_user, login_required
from datetime import datetime, timedelta
from flask_jwt_extended import create_access_token
from flask import jsonify
import random
from .models import db, User
from .email import send_otp
auth = Blueprint("auth", __name__, url_prefix="/auth")
def gen_otp():
return str(random.randint(100000, 999999))
@auth.route("/register", methods=["GET", "POST"])
def register():
if request.method == "POST":
otp = gen_otp()
user = User(
email=request.form["email"],
password=generate_password_hash(request.form["password"]),
otp=otp,
otp_expiry=datetime.now() + timedelta(minutes=5)
)
db.session.add(user)
db.session.commit()
send_otp(user.email, otp)
return redirect(url_for("auth.verify", email=user.email))
return render_template("auth/register.html")
# @auth.route("/verify/<email>", methods=["GET", "POST"])
# def verify(email):
# user = User.query.filter_by(email=email).first()
# if request.method == "POST":
# if user.otp == request.form["otp"] and user.otp_expiry > datetime.now():
# user.is_verified = True
# user.otp = None
# db.session.commit()
# return redirect(url_for("auth.login"))
# return render_template("auth/verify_otp.html")
@auth.route("/verify/<email>", methods=["GET", "POST"])
def verify(email):
user = User.query.filter_by(email=email).first()
if request.method == "POST":
if user.otp != request.form["otp"]:
return render_template("auth/verify_otp.html", error="Invalid OTP")
if user.otp_expiry < datetime.now():
return render_template("auth/verify_otp.html", error="OTP expired")
user.is_verified = True
user.otp = None
db.session.commit()
return render_template(
"auth/login.html",
success="Email verified successfully"
)
return render_template("auth/verify_otp.html")
@auth.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST":
user = User.query.filter_by(email=request.form["email"]).first()
if user and check_password_hash(user.password, request.form["password"]) and user.is_verified:
login_user(user)
token = create_access_token(identity=user.id)
return jsonify({
"message": "login success",
"access_token": token
})
return render_template("auth/login.html")
@auth.route("/logout")
@login_required
def logout():
logout_user()
return redirect("/")
|