用于非常简单的工作流和几乎没有用户交互的瓶子web框架的身份验证

bottleship的Python项目详细描述


瓶装水

https://img.shields.io/pypi/v/bottleship.svghttps://img.shields.io/travis/omtinez/bottleship.svgdocumentation status

瓶子网络框架的身份验证变得简单。

  • 自由软件:麻省理工学院许可证
  • 文档:https://bottleship.readthedocs.org" rel="nofollow">https://bottleship.readthedocs.org

简介

BottleShip是一个非常简单的使用Bottle Web框架进行身份验证的库。它支持 简单应用程序所需的注册、登录和身份验证的标准工作流 需要为单个用户保持状态的。

功能

  • 非常简单易用
  • 在python 2.x和3.x上都有效
  • 依赖关系很少

入门

本文档假设您已经有一个工作瓶应用程序,或者 有点熟悉瓶网框架。如果你需要瓶子的参考文件, 以下是链接

安装瓶装水的最简单方法是使用pip:

$ pip install bottleship

安装了BottleShip后,这就是使用身份验证来锁定某些路由所需要的 它们只能由登录的用户使用:

# Instantiate class and register "register" and "login" routesbs=BottleShip()bs.route('/register',method=('GET','POST'),callback=bs.register)bs.route('/login',method=('GET','POST'),callback=bs.login)# This API endpoint can only be reached by users who have logged in@bs.require_auth('/testapi',method=('GET','POST'))deftestapi(bottleship_user_record):return"Hello, %s!"%bottleship_user_record.get('Username')

新用户可以通过访问 /register 端点并发送其 用户名来注册 密码 作为他们请求的一部分。例如,新用户可以注册到 要求:

< Buff行情>
>>> curl http://127.0.0.1:8080/register?Username=john&Password=1234
... HTTP/1.0 200 OK
... Content-Length: 155
... Content-Type: text/html; charset=UTF-8
... Date: Sun, 17 Jan 2016 23:36:02 GMT
... Server: WSGIServer/0.1 Python/2.7.10
...
... {"Username": "john", "SecurityLevel": "plaintext", "Password": "1723328
... 704", "RemoteIpAddr": "127.0.0.1", "__id__": "040220e5-1cce-4cdd-af9d-2
... ad2885263aa"}

同样,要登录,用户可以发出以下请求:

< Buff行情>
>>> curl http://127.0.0.1:8080/login?Username=john&Password=1234
... HTTP/1.0 200 OK
... Content-Length: 247
... Content-Type: text/html; charset=UTF-8
... Date: Sun, 17 Jan 2016 23:36:03 GMT
... Set-Cookie: Token=5f04ee43-83bb-46c0-96aa-65a2c585a796; Path=/
... Server: WSGIServer/0.1 Python/2.7.10
...
... {"Username": "john", "SecurityLevel": "plaintext", "LastLogin": "145307
... 3842.72", "Token": "5f04ee43-83bb-46c0-96aa-65a2c585a796", "__id__": "0
... 40220e5-1cce-4cdd-af9d-2ad2885263aa", "Key": null, "Password": "1723328
... 704", "RemoteIpAddr": "127.0.0.1"}

两个请求都将返回一个json对象,该对象表示包含 瓶装水服务器有关于用户的信息。登录请求返回的json还有一个名为 包含用户会话令牌的令牌 。除此之外,返回的请求将 同时将会话令牌作为cookies的一部分存储在请求头中。

如果登录成功,用户现在可以提出以下请求:

< Buff行情>
>>> curl http://127.0.0.1:8080/testapi3?Token=5f04ee43-83bb-46c0-96aa-65a2c
    585a796
... HTTP/1.0 200 OK
... Content-Length: 12
... Content-Type: text/html; charset=UTF-8
... Date: Sun, 17 Jan 2016 23:36:04 GMT
... Server: WSGIServer/0.1 Python/2.7.10
...
... Hello, john!

如果一切正常,用户将收到 你好,约翰!>

路线

瓶装水的方法与瓶装水的方法相比具有几乎相同的特征 路线 。主要区别在于,它没有一个回调参数,而是有两个:

  • 回调成功 。可选;大致相当于瓶子的 回调 。如果没有设置, 默认情况下,将请求发送回状态代码为 200 和body ok 的用户。
  • 回调失败 。可选;如果未设置,则默认为使用 403 的状态代码和包含故障详细信息(但没有堆栈跟踪)的正文。

像瓶子的 路线 方法一样,可以使用 要求认证 方法作为一个常规函数 用于 回调成功 回调失败 的可调用对象参数,或作为 包装函数 回调成功

对于可依赖cookies作为会话令牌的web浏览器应用程序,此 功能实质上是替换瓶子的 路径。例如,下面 片段:

app=Bottle()@app.route('/hello/<name>')defhello(name):return'Hello, %s!'%name

变成这样:

app=BottleShip()@app.require_auth('/hello/<name>')defhello(name):return'Hello, %s!'%name

为方便起见,并避免与多个用户的底层数据交互 在应用程序的层中,路由可以通过添加 函数签名中名为 bottleship_user_record的参数。信息将是 表示为a dict 并包含:

  • 用户名
  • 密码 ,如果有(哈希)
  • 数据库引擎内部使用的
  • 远程IP地址
  • 客户在注册或登录过程中添加的作为请求一部分的任何其他信息

然后,可以进一步简化前面的示例,并将其更改为:

app=BottleShip()@app.require_auth('/hello')defhello(bottleship_user_record):return'Hello, %s!'%bottleship_user_record.get('Username')

安全性

不用说,您不应该像这样通过普通连接传输密码 在上面的例子中。如果无法在用户和 服务器,您唯一的希望是实现一个公钥方案,以允许用户的安全传输 密码和令牌。这种计划并没有在瓶装水运输中实施,但在 使安全性略有提高的地方。

注册时,记录用户提供的所有信息。大部分是 由用户自己提供,因此很容易伪造,但IP地址略多 很难伪造。使用用户IP地址以及某种形式的白名单(或 黑名单),可以相对提高应用程序的安全性。为了达到这个目的 必须在实例化时提供白名单,如:

valid_users={"RemoteIpAddr":"127.0.0.1"}bs=BottleShip(whitelist_cond=valid_users)

然后,当用户注册时,BottleShip将确保只有来自所提供IP的请求 地址有权到达端点。

关于用户IP地址的另一个缓解措施是验证地址是否不变 在注册和登录之间。这是通过将 +ipaddr 附加到所需的安全性来实现的。 注册时水平。例如,可以使用以下请求注册新用户:

< Buff行情>
$ pip install bottleship
0

注意, + 符号是url编码的,因此 纯文本 变成 纯文本+ipaddr ,即 编码成 明文%2bipaddr 。IP地址验证是唯一将 在注册和登录之间保持。除此之外,登录期间的安全级别可以是 无论客户在注册过程中选择何种安全级别。

更复杂的安全缓解措施是对交换的信息执行hmac签名。 在注册和登录期间在客户端和服务器之间。这需要一个额外的步骤来 在注册和/或登录之前执行密钥交换。密钥交换将为用户提供 使用一个一次性令牌,客户端可以使用该令牌发送已签名的服务器信息 使用交换过程中提供的密钥。

< Buff行情>
$ pip install bottleship
1

请注意,令牌是以base64编码的,随后使用用户提供的密钥进行签名。解码 上面的字符串产生 {"token": "48f25c89-fd86-4a37-8f26-46f16a4c5eab"}

然后可以对其进行哈希运算,并使用用户提供的密钥验证签名。在下一个 步骤,客户端可以发送所有编码和签名的用户信息以及一次性使用 令牌,以便服务器知道使用哪个密钥来验证数据:

< Buff行情>
$ pip install bottleship
2

数据R服务器返回的是纯文本,因为在 请求。如果客户端希望对用户信息进行编码,则必须显式指定安全性 执行签名验证的级别。

身份验证工作流中除注册之外唯一支持编码的其他方法 是登录。函数签名是相同的,令牌也是一次性使用的。登录后,任何 api中 标记 的进一步引用假定它是会话标记。值得注意的是 因为令牌和用户密钥的使用时间应该和会话的持续时间一样长,所以 对令牌或用户密钥进行编码、散列或以其他方式隐藏是没有意义的。既然是同一根弦, 加密或其他方式,将由客户端在每个请求中发送,这对 攻击者可以嗅探令牌的明文版本或加密版本;他可以只显示 具有相同字符串的服务器将被接受为有效。出于类似的原因,密码 以明文形式发送到服务器,并且只在内部进行哈希运算。

许可证

版权所有(c)2016奥斯卡马丁内斯 保留所有权利。

特此免费向获得本软件副本的任何人授予许可,并且 相关文档文件("软件"),无限制地处理软件, 包括但不限于使用、复制、修改、合并、发布、分发, 再授权和/或出售软件的副本,并允许软件的使用者 在满足以下条件的情况下,可以这样做:

上述版权公告及本许可公告须包括在所有副本内,或 软件的重要部分。

本软件按"原样"提供,不作任何形式的明示或默示保证,包括但 不限于适销性、特定用途适用性和 不侵犯。在任何情况下,作者或版权持有人均不对任何索赔负责, 损害赔偿或其他责任,不论是在合同诉讼、侵权诉讼或其他诉讼中,由 属于或与本软件有关,或与本软件的使用或其他交易有关。

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

推荐PyPI第三方库


热门话题
java如何在Microsoft Office Word或Excel文档中查找突出显示的文本   Java反射:获取方法返回参数的类型   java根据从字符串解析的日期对ArrayList<String>进行排序   不带IDE JSONObject的json JAVA   Selenium检查属性是否包含java中字符串的一部分   java Hibernate在使用@PostConstruct时找不到绑定到线程的会话   java频繁访问对象属性会带来成本吗?   java如何使用spring boot从json更新数据   Android Studio中的java适当边距布局   java spring引导无法在spring测试类中注入spring服务   java在插入排序中删除重复项   如何在JAVA中重写异常类方法   java Guava缓存内存泄漏   多线程处理三个必须并行执行的任务completableFuture,如果其中任何一个在java中引发异常,则全部取消