谷歌应用引擎的安全脚手架

Toaster-Secure-Scaffold-RC的Python项目详细描述


安全gae脚手架(python 3)

简介

请注意:这不是谷歌的官方产品。

这是一个安全的脚手架包,主要用于 谷歌应用程序引擎(尽管不限于此)。

它是用python 3和flask构建的。

默认情况下,scaffold通过 在secure_scaffold/factories.py中找到一个烧瓶应用程序工厂。此应用程序将:

  1. 设置分类的安全头(严格的传输安全性,X帧选项, x-xss-protection、x-content-type-options、内容安全策略 强默认值有助于避免跨站点脚本(XSS)等攻击 以及跨站点脚本包含。请参见添加CSP头设置.csp配置
  2. 默认情况下,在使用任何动词other的已验证请求上验证xsrf令牌 得到、得到或选择。有关详细信息,请参见安全脚手架/xsrf.py
  3. < > >

    用法

    安装

    由于目前处于beta测试阶段,我们有一个beta-pypi包。

    此项目可以通过

    pip安装烤面包机安全脚手架rc

    为了您的方便,我们还可以选择与其他 contrib api的依赖项,如云任务、数据存储和firestore。

    这些可以包含在[]语法中。例如,所有这些都可以安装 通过:

    pip install toaster secure scaffold rc[datastore,firestore,tasks]

    设置

    安装后,您可以通过运行:

    secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
    

    有关此命令的详细信息,请运行:

    secure_scaffold start-project --help
    

    应用程序工厂

    要在应用程序中使用安全脚手架,请使用我们的应用程序生成器。

    fromsecure_scaffoldimportfactoriesapp=factories.AppFactory().generate()

    这将自动设置所有需要的CSP标题。

    XSRF

    要启用xsrf保护,请将decorator添加到需要它的端点。 这需要在route decorator之后设置 例如

    fromsecure_scaffoldimportfactoriesfromsecure_scaffoldimportxsrfapp=factories.AppFactory().generate()@app.route('/',methods=['GET','POST'])@xsrf.xsrf_protected()defindex():return'Hello World!'

    我们为xsrf使用烧瓶会话,因此您应该为您的应用程序设置一个唯一的密钥。

    应用程序工厂中设置了一个随机会话,但是您应该自己覆盖它,请参见flask sessions

    设置配置

    与django设置类似,要启用多个设置文件,需要设置一个环境变量。 您的文件夹结构应包括包含设置文件的设置文件夹,例如:

    my_project/
        settings/
            __init__.py
            base.py
            development.py
            production.py
    

    然后,您应该将环境变量(设置模块)设置为该环境中所需的设置。

    export SETTINGS_MODULE=settings.development
    

    然后,您可以将设置导入到项目中,如下所示:

    from secure_scaffold.config import settings
    

    身份验证

    安全脚手架提供了两种身份验证方法。一个是内置的 基于googleoauth2系统的认证系统。另一种选择是依赖iap的系统

    OAuth2用户

    第二代应用引擎系统已经删除了用户api,因此 原始功能不可用。因此,现在建议使用 单独的系统,如googleoauth2。安全脚手架为此提供了一个包装器 主要基于本指南

    要使其正常工作,需要进行一些最小的设置。

    首先是提供一个OAuth客户机ID。 oauth客户端id在这里。确保添加 您使用的域指向授权的javascript源代码授权的重定向uri。 您可以在其中包含localhost:5000,以便在开发中使用此系统。

    一旦有了客户机ID就将其添加到设置文件l中IKSO:

    AUTH_OAUTH_CLIENT_ID='my-client-id'

    完成后,只需将auth blueprint注册到您的项目中,如下所示:

    fromsecure_scaffoldimportfactoriesfromsecure_scaffold.contrib.users.authimportauth_handlerapp=factories.AppFactory().generate()app.register_blueprint(auth_handler.blueprint)

    这将在/auth/login/auth/authenticate创建两个enpoint。登录提供前端 使用谷歌登录按钮。这将向/auth/authenticate发送一个api请求,该请求将验证 登录过程并返回要重定向到的终结点。默认情况下,这是/

    如果要强制用户登录以访问URL,可以使用提供的 需要登录

    secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
    
    0

    如果用户登录,他们将能够看到该页。如果不是,他们会的 自动重定向到/auth/login

    扩展OAuth2系统。

    OAuth2系统是使用位于secure\u scaffold.contrib.users.auth.authhandler的类构建的

    这个类被设计成易于子类化和重写。例如,如果你想 更改用户登录时重定向到的URL,您可以这样做:

    secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
    
    1

    iap用户

    这在secure_scaffold.contrib.appengine.users上提供。它提供一个用户 类,其中有一些有用的方法提供当前用户的详细信息。 它还提供requires\u authrequires\u admindecorators来强制执行 分别对其应用到的视图具有身份验证和管理权限。

    它们的工作原理与第一代应用程序引擎API中的工作原理几乎相同。

    要使用这些,您需要在应用程序引擎实例上启用iap。这是 为应用程序提供此功能的正确标题。

    数据存储/Firestore

    secure scaffold为datastore和firestore提供了内置的api。

    这是一个部分orm-它允许您简单地定义数据模型,创建, 检索、更新和删除它们(crud)。但是它不适用于关系 或嵌套实体/文档。

    要使用此API,必须创建一个设置文件,其中包含一个名为database\u settings的变量。 这必须是一个带两个字段的dict,一个是引擎字段,一个是设置字段。

    • 引擎必须引用具有适当数据库引擎的模块,此 允许代码在数据库(如firestore和datastore)之间切换 一次设置更改。
    • 设置是将传递给数据库引擎客户端的设置。作为一个 最少应包含指向gcloud项目的项目

    设置应该如下:

    secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
    
    2

    上面使用的是firestore引擎。要使用数据存储,您应该替换 使用 安全脚手架.contrib.db.engine.datastore。不需要更改其他代码。

    api的使用方式如下:

    secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
    
    3

    api操作一个基本的验证系统-在模型类中定义字段, 每个字段都有一个类型和一些可选参数。如果字段接收到 错误的类型会引发错误。

    任务

    安全脚手架带有一个用于设置任务的系统 谷歌云任务

    该系统通过创建一个类实例并注册函数来工作 astask使用由taskrunner实例提供的装饰器的对象。

    这将在a烧瓶蓝图中创建一个视图 存储在taskrunner实例中,并向注册的 函数-允许任务队列稍后运行该函数。

    设置

    要使此模块正常工作,您必须首先安装google cloud tasks

    secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
    
    4 <P>您还必须在设置文件中添加cloud_tasks_queue_config对象。 应该是这样的:

    secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
    
    5

    使用

    任务系统的基本示例如下:

    secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
    
    6

    这将建立一个安全的scaffold应用程序和一个任务运行程序。然后登记 应用程序中任务运行程序的蓝图。

    我们创建一个task函数,它从 全局请求对象并打印它。已注册为任务 使用task\u runner.taskdecorator。

    最后,我们创建一个名为main的flask路由,它调用delay方法 我们的任务。

    在幕后发生的是我们的任务运行器创建一个任务对象 包含此函数和delay方法。然后注册对象 作为烧瓶路径,位于/tasks/print_task/任务对象延迟方法 向云任务api发出请求,以在中创建此方法的任务 排队。它接受任意参数和关键字参数并添加 将它们发送到请求的主体-通过 flask.request任务中的全局变量。

    脚手架开发

    结构:

    安全脚手架/

    • 顶级目录

    安全脚手架/contrib

    • 包含不必要但有用的库。
    • 包含应用程序引擎API的几种替代方案 它们在第二代实例中不再可用

    安全脚手架/测试

    • 安全脚手架测试

    安全脚手架/config.py

    • 类似于django设置
    • 查找要设置的"settings\u module"环境变量
    • 有关如何使用此功能,请参见下面的设置配置

    安全脚手架/工厂.py

    • 应用安全默认值的主烧瓶应用程序工厂
    • 请参见下面的app factory了解如何使用此功能

    安全脚手架/settings.py

    • 安全设置
    • 定义我们的CSP标题和其他细节

    安全脚手架/xsrf.py

    • 定义要与烧瓶应用程序一起使用的xsrf装饰器
    • 请参见下面的xsrf了解如何使用此功能

    依赖项设置

    我们建议设置虚拟环境以安装依赖项:

    virtualenv env--python=python3

    源env/bin/activate

    pip安装-r dev_requirements.txt

    开发特定子模块需要一些额外的依赖项。

    其中包括:

    • google cloud firestore用于"secure_scaffold.contrib.db.engine.firestore"上的开发
    • google cloud datastore用于"secure_scaffold.contrib.db.engine.datastore"上的开发
    • google cloud tasks用于在"secure\u scaffold.contrib.cloud\tasks.tasks"上开发

    测试

    运行单元测试:

    pytest

    第三方信贷

    • 烧瓶

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


热门话题
尝试运行JFLAP。戴软呢帽的罐子23。Java正在抛出异常   无引用的java数组布尔复制   hibernate如何在java SE应用程序中使用JPA EntityManager   java如何使用ORMLite在SQLite中持久化JavaFX属性?   java无法将项目部署到GAE   java:谷歌地图维基百科层   java Resultset(getter/setter类)对象在第二次执行时未删除旧值   s中的java struts2:选择列表>请求的列表键“”作为集合/数组/映射/枚举/迭代器类型   java如何在Karaf 4.0.5中获得BaseDao中的entityManager?   java VSCode未从控制台读取西里尔文   java字体。createFromAsset()返回字体的空指针异常   java错误:将Android Studio从0.6.1更新到0.8.9后,没有合适的构造函数