[Python] Login Google API Flask Python

Discussão em 'Python' iniciado por Stack, Abril 6, 2025.

  1. Stack

    Stack Membro Participativo

    I'm trying to implement Google login using Flask Python. All the keys match in my app and Google API settings. Everywhere I've set localhost with port 5000. It allows me to log in, I confirm it via my phone, but when it should redirect to the main page with the logged-in user, it throws the error shown in image No. 2. IMAGE

    from flask import Flask, render_template, request, redirect, url_for, flash
    from flask_sqlalchemy import SQLAlchemy
    from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
    from werkzeug.security import generate_password_hash, check_password_hash
    from flask_dance.contrib.google import make_google_blueprint, google
    import os

    from flask_dance.contrib.google import make_google_blueprint, google


    app = Flask(__name__)
    app.secret_key = 'kasjkjk48g48d48s4848df'

    # leidžiam naudoti HTTP (tik testavimui)
    os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"

    # Google OAuth blueprint


    google_bp = make_google_blueprint(
    client_id="501193612xxxj3de342hp2bg.apps.googleusercontent.com",
    client_secret="GOCSPxxxpH28YVhpv_ELbbU",
    redirect_url="http://localhost:5000/login/google/authorized", # Patikrinkite, kad šis URL tiksliai atitiktų
    scope=["openid", "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile"]
    )


    app.register_blueprint(google_bp, url_prefix="/login")

    # PostgreSQL nustatymai
    DB_USER = 'xxxx'
    DB_PASSWORD = 'xxx'
    DB_HOST = '127.0.0.1'
    DB_NAME = 'autogptdb'
    app.config['SQLALCHEMY_DATABASE_URI'] = f'postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}/{DB_NAME}'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

    db = SQLAlchemy(app)

    # ✅ Flask-Login setup
    login_manager = LoginManager()
    login_manager.init_app(app)
    login_manager.login_view = 'login' # jei vartotojas nėra prisijungęs – redirectins į login

    # ✅ Vartotojų modelis
    class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True, nullable=False)
    password = db.Column(db.String(200), nullable=True)

    # ✅ User loader
    @login_manager.user_loader
    def load_user(user_id):
    return User.query.get(int(user_id))

    # ✅ Sukuria lenteles, jei jų nėra
    def create_tables():
    with app.app_context():
    db.create_all()

    @app.route('/')
    def home():
    return render_template('index.html', user=current_user)

    @app.route("/login/google/authorized")
    def google_login():
    if not google.authorized:
    flash("Nepavyko prisijungti per Google.", "danger")
    return redirect(url_for("login")) # Nebereikia dar kartą pereiti į Google login.

    try:
    resp = google.get("/oauth2/v2/userinfo")
    if not resp.ok:
    flash("Nepavyko gauti informacijos iš Google", "danger")
    return redirect(url_for("login"))

    user_info = resp.json()
    email = user_info.get("email")

    if not email:
    flash("Google nepateikė el. pašto", "danger")
    return redirect(url_for("login"))

    user = User.query.filter_by(username=email).first()
    if not user:
    # Jei nėra vartotojo, sukuriame jį
    user = User(username=email, password=None) # Nereikia slaptažodžio, nes prisijungta per Google
    db.session.add(user)
    db.session.commit()

    login_user(user) # Prisijungimas
    flash("Prisijungta per Google!", "success")
    return redirect(url_for("home")) # Nukreipimas į pagrindinį puslapį

    except Exception as e:
    flash(f"Klaida: {e}", "danger")
    return redirect(url_for("login"))






    @app.route('/register', methods=['GET', 'POST'])
    def register():
    if request.method == 'POST':
    username = request.form['username']
    password = request.form['password']
    confirm_password = request.form['confirm_password']

    if password != confirm_password:
    flash('Slaptažodžiai nesutampa', 'danger')
    return redirect(url_for('register'))

    hashed_password = generate_password_hash(password)

    if User.query.filter_by(username=username).first():
    flash('Vartotojas jau egzistuoja', 'danger')
    return redirect(url_for('register'))

    new_user = User(username=username, password=hashed_password)
    db.session.add(new_user)
    db.session.commit()
    flash('Registracija sėkminga, prisijunkite', 'success')
    return redirect(url_for('login'))

    return render_template('register.html')

    @app.route('/login', methods=['GET', 'POST'])
    def login():
    if request.method == 'POST':
    username = request.form['username']
    password = request.form['password']

    user = User.query.filter_by(username=username).first()
    if user and check_password_hash(user.password, password):
    login_user(user)
    flash('Prisijungta sėkmingai', 'success')
    return redirect(url_for('home'))
    else:
    flash('Neteisingi prisijungimo duomenys', 'danger')

    return render_template('login.html')

    @app.route('/dashboard')
    @login_required
    def dashboard():
    return render_template('dashboard.html')

    @app.route('/logout')
    @login_required
    def logout():
    logout_user()
    flash('Atsijungta sėkmingai', 'info')
    return redirect(url_for('home'))

    if __name__ == "__main__":
    create_tables()
    app.run(host="0.0.0.0", port=5000, debug=True)


    Perhaps someone knows the solution? Thank you.

    Continue reading...

Compartilhe esta Página