Flask-HttpAuth和Flask-Login

16

我正在创建一个小型REST服务。我正在寻找不同的身份验证方法。 对于网站,我使用了Flask-Login模块。它似乎是会话认证(session authentication)。 Flask-HttpAuth模块提供了http和digest身份验证方法。我有点困惑。 它们是否相辅相成? 什么情况下最好使用什么方法?

谢谢。

3个回答

53
对于REST服务,您不需要Flask-Login。在Web服务中,通常不会存储客户端状态(Flask-Login的作用),而是对每个请求进行身份验证。Flask-HTTPAuth为您完成此操作。
仅当应用程序具有Web组件和REST API组件时才使用两者。在这种情况下,Flask-Login将处理Web应用程序路由,而Flask-HTTPAuth将处理API路由。
免责声明:我是Flask-HTTPAuth的作者。

我看了你关于REST的报告。看起来我应该始终发送登录密码。我已经了解了会话认证。希望它存在。我正在开发我的自行车以更好地理解我需要什么。抱歉,但你的例子对我来说不够。我稍后会重新阅读它们。 - Victor Shelepen
5
对于API来说,每个请求都携带身份验证是非常正常的。您可以使用用户名/密码,也可以使用令牌,后者提供了更高的安全性,因为泄漏的令牌可以被撤销。我在我的博客文章中展示了这两种方法。 - Miguel Grinberg
6
哦,其中一个库的作者花时间提供了答案,但 @viktor.likin 甚至没有打算接受或点赞这个答案。感谢 Miguel Grinberg 提供洞见,请接受我的投票。 - Roy Prins
1
@SJoshi:抱歉,我并不认为那是一个登录过程,这就是我误解你的原因。所以,你有一个“获取令牌”API路由,你想知道是否可以将其用于基于Web的登录表单?提交凭据的方法将是不同的,你可能会使用JSON格式的API和标准表单编码的Web应用程序。结果也是不同的。对于API,你需要返回一个令牌,而对于Web应用程序,你需要在用户会话中记录已登录状态,因为你无法轻松地使浏览器发送令牌,但很容易让它发送一个cookie。 - Miguel Grinberg
3
如果你愿意,你可以将API使用的相同令牌写入cookie中,但行为会有很大不同,因此最好将令牌生成移至一个共同模块,以便Web应用程序和API都可以访问。或者只需让Flask生成用户会话,并为Web应用程序使用Flask-Login,而将令牌留给API。 - Miguel Grinberg
显示剩余5条评论

2
您可以非常简单地为Flask设置Basic Auth,无需使用其他模块,只需使用修饰符即可。
请查看:http://flask.pocoo.org/snippets/8/
对于flask-restful,只需将method_decorators = [required_auth]添加到Resource类属性中即可。
您可以扩展上面的片段,例如从数据库中检索用户。
请注意,在REST架构中,请求是无状态的:您不使用会话,而是在每个请求中发送身份验证令牌(请参见http://broadcast.oreilly.com/2009/12/principles-for-standardized-rest-authentication.html)。

我同意你的观点。我一直在寻找一个现成的解决方案。虽然你所描述的我也能够自己完成,但似乎应该已经存在这样的解决方案。 - Victor Shelepen

1

是的,它们互补。

您还可以查看Flask-security,这是一个全能库:

https://pythonhosted.org/Flask-Security/

  • 基于会话的身份验证
  • 角色管理
  • 密码加密
  • 基本HTTP身份验证
  • 基于令牌的身份验证
  • 基于令牌的帐户激活(可选)
  • 基于令牌的密码恢复/重置(可选)
  • 用户注册(可选)
  • 登录跟踪(可选)
  • JSON / Ajax支持

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接