我想使用Django REST框架构建REST API。最初它的客户端将是一个Web应用程序,但可以想象未来的客户端可能包括移动应用程序。
不幸的是,我发现documentation中列出的身份验证类列表有点令人困惑。看起来TokenAuthentication
符合我的需求。我宁愿避免OAuth的认知开销,除非有一个令人信服的安全理由去那样做。
这是我想在这个早期阶段做出决定的决定。任何人都可以提供任何建议吗?
编辑:虽然希望不相关,但我想我会提到我将Neo4j用作应用程序的后端,而不是传统的SQL数据库。
答案 0 :(得分:35)
Django REST Framework为您提供了多种身份验证方法的灵活性。由于我有一些时间,并且对将来有类似问题的访问者有用,我将概述最常见的身份验证方法的好处。
最初它的客户端将是一个Web应用程序,但可以想象未来的客户端可能包括移动应用程序。
通常,当使用位于同一域的Web应用程序和使用Django实例的API时,大多数人使用SessionAuthentication
,因为它使用现有的身份验证方法与服务器进行交互。身份验证可以无缝运行,因此您无需执行第二个身份验证步骤。
大多数API也支持某种形式的BasicAuthentication
,很可能是因为它最容易测试,但也因为它最容易实现。对于您的Web应用程序,这不是推荐的身份验证方法,但对于您的移动应用程序,它的使用情况并不少见。我个人会推荐基于令牌的身份验证,因此您不必担心客户端会截取用户的凭据。
看起来
TokenAuthentication
符合我的需求。
许多人使用TokenAuthentication
因为它的理解和使用相对简单,而且它似乎首先满足了每个人的需求。令牌直接附加到用户,并且它们不会自动轮换(though you can make them automatically rotate),因此代表用户工作的每个客户端都会获得相同的令牌。如果您需要撤销令牌,这可能是一个问题,因为所有其他客户端也会使其令牌失效。
我宁愿避免OAuth的认知开销,除非有一个令人信服的安全理由去那样做。
OAuth 2(OAuth2Authentication
)在TokenAuthentication
的好处之上为您提供令牌轮换和令牌过期。还有一个好处是能够在不影响为用户进行身份验证的其他客户端的情况下撤销单个令牌。您还可以通过使用范围将客户端限制到API的各个区域,如果您使用的API的某些区域比其他区域更常用,这将非常有用。
我还要提到JSON Web Tokens,因为虽然我没有使用它,但它在支持频道中已经出现了很多。就检索令牌而言,它与TokenAuthentication
非常相似,但它具有客户端和令牌过期的唯一令牌的附加好处。