如何实现Python REST身份验证

时间:2013-03-06 14:07:28

标签: python rest authentication

我是新手,我想做以下

我有服务端点,如

@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世界的新手,并不知道如何实现这一点。

谢谢

3 个答案:

答案 0 :(得分:2)

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

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

对于用户和客户端的身份验证,可能需要查看OAuth 2.0(HTTP MAC Auth是相关规范)。

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

答案 1 :(得分:1)

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

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

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

根据频道(普通HTTP),您可能希望使用HMAC对请求进行签名,而不是在野外发送秘密。你必须注意重放攻击。时间攻击是可能的。加密冲突可能会用来打败你的计划。您可能需要令牌以避免CSRF(如果Web浏览器不起作用,则不需要这样做,但是您没有指定它)

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

答案 2 :(得分:0)

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

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

就缩放而言,我猜您的关注点是会话不应该特定于给定的机器。认证数据可以与HTTP前端分开存储在商店中。这样,您可以添加其他Web服务器并扩展前端或添加其他数据存储,并根据需要进行扩展。