首页 > 编程问答 >Flask 用户身份验证包括登录、注册和谷歌登录未集成在一起

Flask 用户身份验证包括登录、注册和谷歌登录未集成在一起

时间:2024-08-04 15:09:30浏览次数:12  
标签:python flask google-oauth flask-login

https://www.freecodecamp.org/news/how-to-setup-user-authentication-in-flask/

我已经使用上面的链接进行了基本的用户身份验证,但我无法添加谷歌登录。

我已经尝试了很多次,但我无法添加谷歌登录。

任何人都可以帮我做这个吗? 问题是有src_ init _.py和manage.py(这是在src之外) 所以我不知道如何添加谷歌登录


当然,我可以帮将 Google 登录功能集成到的 Flask 应用程序中。

理解目录结构

提到了 src_init_.py manage.py 文件,以及 src 文件夹。这种结构通常用于组织更大的 Flask 应用程序。

  • src 文件夹包含应用程序的主要代码。
  • src/__init__.py 文件用于初始化的 Flask 应用程序、配置数据库连接、注册蓝图等。
  • manage.py 文件通常用于运行脚本,例如启动开发服务器或与数据库交互。

集成 Google 登录

我们将使用 Flask-Dance 库来简化 Google 登录的集成。以下是将 Google 登录添加到的 Flask 应用程序的分步指南:

1. 安装必要的库:

pip install Flask-Dance[sqlalchemy,google]

2. 配置 Google OAuth 凭据:

  • 访问 Google Cloud Console ( https://console.cloud.google.com ) 并创建一个新项目。
  • 导航到“API 和服务”>“凭据”。
  • 点击“创建凭据”>“OAuth 客户端 ID”。
  • 选择“Web 应用程序”作为应用程序类型。
  • 在“授权重定向 URI”字段中,输入以下内容,并替换 your-domain 为的应用程序域名:
    • http://your-domain:5000/login/google/authorized
  • 点击“创建”。
  • 记下生成的“客户端 ID”和“客户端密钥”。

3. 更新的 Flask 应用程序:

  • src/__init__.py 文件中:
from flask import Flask, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin
from flask_dance.consumer.storage.sqla import OAuthConsumerMixin, SQLAlchemyStorage
from flask_dance.consumer import oauth_authorized, oauth_error
from flask_dance.contrib.google import make_google_blueprint
import os

# ... 其他导入 ...

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'

db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'

# Google OAuth 配置
os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'  # 仅用于开发环境
blueprint = make_google_blueprint(
    client_id="your-client-id",
    client_secret="your-client-secret",
    scope=["profile", "email"],
    storage=SQLAlchemyStorage(OAuthConsumerMixin, db.session, user=User),
    redirect_url="/"
)
app.register_blueprint(blueprint, url_prefix="/login")

# ... 其他代码 ...

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

# 处理 Google 登录回调
@oauth_authorized.connect_via(blueprint)
def google_logged_in(blueprint, token):
    if not token:
        return False

    resp = blueprint.session.get("/oauth2/v2/userinfo")
    if not resp.ok:
        return False

    info = resp.json()
    user = User.query.filter_by(email=info["email"]).first()

    if user:
        # 用户已存在,直接登录
        login_user(user)
    else:
        # 创建新用户
        user = User(name=info["name"], email=info["email"])
        db.session.add(user)
        db.session.commit()
        login_user(user)

    return redirect(url_for('home'))

# 处理 Google 登录错误
@oauth_error.connect_via(blueprint)
def google_error(blueprint, message, response):
    return "Google 登录出错: " + str(message)

# ... 其他路由和视图函数 ...
  • 替换占位符:
    • your-client-id your-client-secret 替换为在 Google Cloud Console 中获得的实际值。
    • http://your-domain:5000 替换为应用程序的实际域名和端口。
  • 确保 User 模型定义正确:
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255))
    email = db.Column(db.String(255), unique=True)
    # ... 其他用户字段 ...

4. 创建数据库表:

flask db init
flask db migrate
flask db upgrade

5. 运行的应用程序:

flask run

现在,应该会在的 Flask 应用程序中看到一个“使用 Google 登录”按钮。点击此按钮将重定向用户到 Google 进行身份验证。成功登录后,他们将被重定向回的应用程序,并在的数据库中创建一个新用户(如果该用户尚不存在)。

注意:

  • 以上代码示例假设已经设置了 Flask-SQLAlchemy 和 Flask-Login。
  • OAUTHLIB_INSECURE_TRANSPORT 设置为 1 仅用于本地开发环境。在生产环境中,请确保使用 HTTPS。
  • 可以根据需要自定义 Google 登录按钮的外观和行为。
  • 确保仔细阅读 Flask-Dance 文档以获取更多高级选项和自定义设置: https://flask-dance.readthedocs.io/

标签:python,flask,google-oauth,flask-login
From: 78830424

相关文章

  • 如何在python中使用xarray打开grib2文件?
    将xarray导入为xr导入cfgrib导入生态码将pandas导入为pddata=xr.open_dataset(r"C:\Users\new\forecast_data.grib2",engine="cfgrib")这是我的代码。我只想使用xarray读取这个文件。错误是:无法识别的引擎cfgrib必须是以下之一:['netcdf4'、'scipy'、'......
  • 如何在 java 或 python 中使用 HTTP(S) 解决无法解析的主机名或无法识别的名称错误?
    我尝试以编程方式访问网站的信息,但在Java和Python上都无法解析主机名。如果我指定IP地址,则会将错误更改为TLSV1_UNRECOGNIZED_NAME。不过,这个网站无需任何额外的工作就可以通过任何浏览器解决。我在这里浏览了很多潜在的解决方案,但对于Python,它说这个问题应该在2.7......
  • Python 请求 POST 请求与 websockets 库一起使用时挂起
    我使用Python中的requests库发送POST请求,同时维护与websockets库的WebSocket连接:importasyncioimportrequestsimportwebsocketsasyncdefwebsocket_handler(uri):asyncwithwebsockets.connect(uri)aswebsocket:whileTrue:me......
  • 在Python中,list1[::] = list2的空间复杂度是多少?
    此代码首先迭代列表nums,更新整数0、1、2(也分别称为红色、白色和蓝色)的计数。nums保证只有整数0、1和/或2。找到计数后,代码使用[::],这是一种就地修改列表的技巧,以排序numsdefsortColors(self,nums:List[int])->None:re......
  • [附开题]flask框架高校资产管理系统d8y3s(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育事业的快速发展,高校资产规模日益庞大,种类繁多,管理难度显著增加。传统的资产管理方式往往依赖于手工记录和纸质档案,不仅效率低......
  • [附开题]flask框架贺州图特产管理系统uuy79(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景贺州,这座历史悠久、文化底蕴深厚的城市,以其丰富的自然资源和独特的地理位置孕育了众多令人瞩目的特产。然而,在信息化快速发展的今天,贺州特......
  • [附开题]flask框架红枫超市会员管理系统ew5iq(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着零售行业的快速发展与消费者需求的日益多样化,超市作为人们日常生活中不可或缺的一部分,其管理效率和服务质量直接影响着顾客的购物体验......
  • PYTHON专题-(4)python叫你搞对象
    什么是面向过程编程?面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。什么是面向对象编程?面向对象编程——ObjectOrientedProgramming,简......
  • Python 基础教学:中文编码处理
    《Python基础教学:中文编码处理》在编程中,处理中文字符时经常会遇到编码问题。Python3默认使用UTF-8编码,但在处理文件、网络数据或与旧系统交互时,可能需要处理GBK、GB2312等其他编码。1.字符串的编码和解码在Python中,字符串(str)默认是Unicode编码。当你需要将......
  • Python 基础教学:深入了解 continue、break 和 pass 语句
    《Python基础教学:深入了解continue、break和pass语句》Python中的控制流语句不仅仅包括条件语句和循环,还包括continue、break和pass这三个特殊的关键字,它们在特定情况下可以控制程序的流程。1.continue语句continue用于跳过当前循环的剩余代码,在循环控制结......