Login Google API Flask Python
Posted: 06 Apr 2025, 22:53
Ich versuche, Google Login mit Flask Python zu implementieren. Alle Tasten stimmen in meine App- und Google -API -Einstellungen überein. Überall, wo ich Localhost mit Port 5000 festgelegt habe, kann ich mich über mein Telefon anmelden, aber wenn es mit dem angemeldeten Benutzer auf die Hauptseite umleiten sollte, wirft es den in Bild Nr. 2.
Bild < /p>
angezeigten Fehler aus.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)
< /code>
Vielleicht kennt jemand die Lösung? Danke.
Bild < /p>
angezeigten Fehler aus.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)
#
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login' # jei vartotojas nėra prisijungęs – redirectins į login
#
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)
#
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
#
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)
< /code>
Vielleicht kennt jemand die Lösung? Danke.