谷歌应用引擎的安全脚手架
Toaster-Secure-Scaffold-Beta的Python项目详细描述
安全gae脚手架(python 3)
简介
请注意:这不是谷歌的官方产品。
这是一个安全的脚手架包,主要用于 谷歌应用程序引擎(尽管不限于此)。
它是用python 3和flask构建的。
默认情况下,scaffold通过
在secure_scaffold/factories.py
中找到一个烧瓶应用程序工厂。此应用程序将:
- 设置分类的安全头(严格的传输安全性,X帧选项,
x-xss-protection、x-content-type-options、内容安全策略
强默认值有助于避免跨站点脚本(XSS)等攻击
以及跨站点脚本包含。请参见
添加CSP头
和
设置.csp配置
- 默认情况下,在使用任何动词other的已验证请求上验证xsrf令牌
得到、得到或选择。有关详细信息,请参见
安全脚手架/xsrf.py
。 < > > 引擎
必须引用具有适当数据库引擎的模块,此 允许代码在数据库(如firestore和datastore)之间切换 一次设置更改。设置
是将传递给数据库引擎客户端的设置。作为一个 最少应包含指向gcloud项目的项目
。- 顶级目录
- 包含不必要但有用的库。
- 包含应用程序引擎API的几种替代方案 它们在第二代实例中不再可用
- 安全脚手架测试
- 类似于django设置
- 查找要设置的"settings\u module"环境变量
- 有关如何使用此功能,请参见下面的设置配置
- 应用安全默认值的主烧瓶应用程序工厂
- 请参见下面的app factory了解如何使用此功能
- 安全设置
- 定义我们的CSP标题和其他细节
- 定义要与烧瓶应用程序一起使用的xsrf装饰器
- 请参见下面的xsrf了解如何使用此功能
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"上开发- 烧瓶
用法
安装
由于目前处于beta测试阶段,我们有一个beta-pypi包。
此项目可以通过
PIP安装烤面包机安全脚手架测试版
为了您的方便,我们还可以选择与其他 contrib api的依赖项,如云任务、数据存储和firestore。
这些可以包含在[]
语法中。例如,所有这些都可以安装
通过:
pip install toaster secure scaffold beta[数据存储、Firestore、任务]
设置
安装后,您可以通过运行:
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
就将其添加到您的设置FI喜欢这样:
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,可以使用提供的
如果用户登录,他们将能够看到该页。如果不是,他们会的
自动重定向到 OAuth2系统是使用位于 这个类被设计成易于子类化和重写。例如,如果你想
更改用户登录时重定向到的URL,您可以这样做: 这在 它们的工作原理与第一代应用程序引擎API中的工作原理几乎相同。 要使用这些,您需要在应用程序引擎实例上启用iap。这是
为应用程序提供此功能的正确标题。 secure scaffold为datastore和firestore提供了内置的api。 这是一个部分orm-它允许您简单地定义数据模型,创建,
检索、更新和删除它们(crud)。但是它不适用于关系
或嵌套实体/文档。 要使用此API,必须创建一个设置文件,其中包含一个名为 设置应该如下: 上面使用的是firestore引擎。要使用数据存储,您应该替换
api的使用方式如下: api操作一个基本的验证系统-在模型类中定义字段,
每个字段都有一个类型和一些可选参数。如果字段接收到
错误的类型会引发错误。 安全脚手架带有一个用于设置任务的系统
谷歌云任务 该系统通过创建一个类实例并注册函数来工作
as 这将在a烧瓶蓝图中创建一个视图
存储在 要使此模块正常工作,您必须首先安装 您还必须在设置文件中添加 任务系统的基本示例如下: 这将建立一个安全的scaffold应用程序和一个任务运行程序。然后登记
应用程序中任务运行程序的蓝图。 我们创建一个task函数,它从
全局 最后,我们创建一个名为 在幕后发生的是我们的 我们建议设置虚拟环境以安装依赖项: 开发特定子模块需要一些额外的依赖项。 其中包括: 运行单元测试:需要登录
0
secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
/auth/login
扩展OAuth2系统。
secure\u scaffold.contrib.users.auth.authhandler的类构建的
1
secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
iap用户
secure_scaffold.contrib.appengine.users
上提供。它提供一个用户
类,其中有一些有用的方法提供当前用户的详细信息。
它还提供
requires\u auth
和requires\u admin
decorators来强制执行
分别对其应用到的视图具有身份验证和管理权限。数据存储/Firestore
database\u settings
的变量。
这必须是一个带两个字段的dict,一个是引擎
字段,一个是
设置
字段。
2
secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
使用
安全脚手架.contrib.db.engine.datastore
。不需要更改其他代码。
3
secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
任务
task
使用由taskrunner
实例提供的装饰器的对象。taskrunner
实例中,并向注册的
函数-允许任务队列稍后运行该函数。设置
google cloud tasks
:
四
secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
cloud_tasks_queue_config
对象。
应该是这样的:
5
secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
使用
6
secure_scaffold start-project PROJECT_NAME GCLOUD_PROJECT_NAME
请求
对象并打印它。已注册为任务
使用task\u runner.task
decorator。main
的flask路由,它调用delay
方法
我们的任务。任务运行器
创建一个任务
对象
包含此函数和delay
方法。然后注册对象
作为烧瓶路径,位于/tasks/print_task/
。任务
对象延迟方法
向云任务api发出请求,以在中创建此方法的任务
排队。它接受任意参数和关键字参数并添加
将它们发送到请求的主体-通过
flask.request
任务中的全局变量。脚手架开发
结构:
安全脚手架/
安全脚手架/contrib
安全脚手架/测试
安全脚手架/config.py
安全脚手架/工厂.py
安全脚手架/settings.py
安全脚手架/xsrf.py
依赖项设置
virtualenv env--python=python3
源env/bin/activate
pip安装-r dev_requirements.txt
测试
pytest
第三方信贷
推荐PyPI第三方库