为 web 应用程序使用的 python REST API 选择适当的身份验证类

Posted

技术标签:

【中文标题】为 web 应用程序使用的 python REST API 选择适当的身份验证类【英文标题】:Appropriate choice of authentication class for python REST API used by web app 【发布时间】:2015-02-19 03:18:30 【问题描述】:

我想使用 Django REST 框架构建一个 REST API。最初它的客户端将是一个 Web 应用程序,但可以想象未来的客户端可能包括移动应用程序。

不幸的是,我发现documentation 中列出的身份验证类列表有点令人困惑。看起来TokenAuthentication 可以满足我的需求。除非有令人信服的安全理由,否则我宁愿避免 OAuth 的认知开销。

这是我想在这个非常早的阶段做出正确的决定。谁能给点建议?

编辑:虽然希望不相关,但我想我会提到我将使用 Neo4j 作为应用程序的后端,而不是传统的 SQL 数据库。

【问题讨论】:

您面临哪些困惑?网络上有大量资源可以解释这些身份验证协议的不同含义 我想我只是发现自己在一个陌生的地方,所以我想我可能会问路。 【参考方案1】:

Django REST Framework 为您提供了多种身份验证方法的灵活性。由于我有一些时间,而且它对未来有类似问题的访问者很有用,我将概述最常见的身份验证方法的好处。

最初它的客户端是一个网络应用程序,但可以想象未来的客户端可能包括移动应用程序。

通常,当使用与 API 位于同一域和 Django 实例的 Web 应用程序时,大多数人使用SessionAuthentication,因为它使用现有的身份验证方法与服务器交互。身份验证无缝运行,因此您无需执行第二个身份验证步骤。

大多数 API 还支持某种形式的 BasicAuthentication,这很可能是因为它最容易测试,也因为它最容易实现。对于您的 Web 应用程序,这不是推荐的身份验证方法,但对于您的移动应用程序,使用它并不少见。我个人会推荐基于令牌的身份验证,因此您不必担心客户端会拦截用户的凭据。

看起来TokenAuthentication 可以满足我的需求。

很多人使用TokenAuthentication是因为它比较容易理解和使用,乍一看似乎满足了大家的需求。令牌直接附加到用户,它们不会自动轮换 (though you can make them automatically rotate),因此代表用户工作的每个客户端都会获得相同的令牌。如果您需要撤销令牌,这可能是个问题,因为所有其他客户端的令牌也会失效。

除非有令人信服的安全理由,否则我宁愿避免 OAuth 的认知开销。

OAuth 2 (OAuth2Authentication) 在 TokenAuthentication 的优势之上为您提供令牌轮换和令牌过期。还有一个好处是能够在不影响为用户进行身份验证的其他客户端的情况下撤销单个令牌。您还可以通过使用范围将客户端限制在 API 的各个区域,如果您的 API 的某些区域比其他区域更常用,这将非常有用。

我还要提到JSON Web Tokens,因为虽然我没有使用它,但它已经在支持渠道中出现了很多。就检索令牌而言,它的工作方式与TokenAuthentication 非常相似,但它具有为客户端提供唯一令牌和令牌过期的额外好处。

【讨论】:

这个答案在很多方面都有帮助,但特别是通过介绍我可以查阅的词汇来帮助我理解,例如'令牌轮换'。 这是一种外交回答。你能用更详细的特征来解释每个主题吗? 但是哪一个最安全?

以上是关于为 web 应用程序使用的 python REST API 选择适当的身份验证类的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 为 Web 客户端授予针对 REST 服务器的 Oauth2 密码

编写一个包装器将现有的 REST API 公开为 SOAP Web 服务?

Python web 开发django rest framwork 的token 登录和原理

为用户和身份验证使用解析服务器并调用其他内部 REST Web 服务

如何使用 django-rest-framework 进行社交登录? [关闭]

用 Python 编写一个客户端来调用一个使用 JWT 身份验证的 REST Web 服务