2

我是新手,我想做以下事情

我有像这样的服务端点

@login_required
@app.route('/')
def home():
  pass

@login_required
@app.route('/add')
def add():
  pass

@login_required
@app.route('/save')
def save():
  pass

@login_required
@app.route('/delete')
def delete():
  pass
  • 我希望在进行这些调用时对用户进行身份验证。
    问题
  • 如何使用 python 对 REST 调用进行身份验证?
  • 我如何确保如果调用登陆以执行任何端点,它们是经过身份验证的?
  • 我如何在不保存任何状态的情况下基本上在 HTTP 标头级别进行所有身份验证,以便将来可以更好地扩展(如 Amazon S3),这意味着任何调用都可能转到不同的服务器并且仍然能够自行进行身份验证。

我对 REST 世界完全陌生,并不真正知道如何实现这一目标。

谢谢

4

3 回答 3

2

首先,一个问题,您是在验证用户、客户端还是两者?

对于客户端的身份验证,我喜欢HTTP MAC 身份验证来进行 REST 服务身份验证。看看 Mozilla Services macauthlib以及它是如何在他们的 pyramid_macauth 项目中使用的。您应该能够以 pyramid_macauth 为例,学习如何应用 macauthlib 来保护您的服务。搜索看看是否有其他人用 Flask 尝试过这个也是一个好主意。

对于用户和客户端的身份验证,也许可以看看 OAuth 2.0 适当的(HTTP MAC Auth 是一个相关规范)。

我曾希望发布更多链接,但是,这是我的第一篇文章,看来我必须在回复中获得更多链接。:)

于 2013-03-06T18:17:49.133 回答
1

安全不适合新手。使用框架并依赖其实现。研究源代码、阅读博客和论文,在某些时候您将能够构建自己的系统。

有很多事情可能会出错,一旦你部署了一个协议,你可能无法在不破坏现有客户端的情况下返回。

也就是说,验证请求的常用方法是使用几个令牌,通常称为公钥和私钥(秘密)。一个变体是使用私钥来生成一个短暂的会话令牌。另一种变体是使用每个客户端特定的 API 密钥。无论如何,此令牌通常在 HTTP 标头中发送(标准 cookie 或自定义 cookie),但也可以使用请求正文。通常它们不会附加到 URL,因为密钥可能以日志文件结尾。此外,您应该注意存储密钥的方式和位置。

根据通道(纯 HTTP),您可能希望使用 HMAC 对请求进行签名,而不是在野外发送秘密。您必须注意重放攻击。定时攻击是可能的。密码冲突可用于破坏您的计划。您可能需要令牌来避免 CSRF(如果 Web 浏览器不发挥作用,这并不是真正需要的,但您没有指定这一点)

同样,选择一个框架,不要自己编写任何代码。损坏的软件通常可以修复,但安全漏洞可能会造成真正的损害。

于 2013-03-06T14:25:10.903 回答
0

查看您的 API,它看起来不像是静止的端点。URI 应该代表某个实体而不是动作。例如,如果您正在处理诸如用户之类的实体,您可以拥有 yourdomain.com/user 并使用 POST、DELETE、PATCH 和 GET 等 HTTP 动词执行各种操作,例如创建、删除、更新和获取(假设您使用烧瓶这可以很容易地实现)。

在安全性方面,我假设有多种方案,但我使用的方案是通过初始身份验证调用生成一个会话令牌,给定密钥和秘密。我建议您寻找有关生成密钥和秘密对以及会话令牌的专业在线资源。

在扩展方面,我猜你担心的是会话不应该特定于给定的机器。身份验证数据可以存储在与 HTTP 前端分开的存储中。通过这种方式,您可以添加额外的网络服务器并扩展您的前端,或者添加额外的数据存储并根据需要进行扩展。

于 2013-03-06T14:35:10.077 回答