Django Rest 框架中的基于会话的与令牌身份验证

Posted

技术标签:

【中文标题】Django Rest 框架中的基于会话的与令牌身份验证【英文标题】:SessionBased vs Token Authentication in Django Rest Framework 【发布时间】:2021-05-10 23:02:03 【问题描述】:

DRF 文档 (https://www.django-rest-framework.org/api-guide/authentication/#authentication) 指出

令牌身份验证适用于客户端-服务器设置,例如 本机桌面和移动客户端。

会话身份验证适用于与您的网站在同一会话上下文中运行的 AJAX 客户端。

然而,大多数关于 Django Rest Framework 身份验证的教程和 *** 问题/答案都建议在大多数情况下使用令牌身份验证,即使是 web 应用程序也是如此。

我正在使用 Django/Django Rest Framework 作为后端,Angular 作为前端来实现一个 webapp。 我应该使用哪种身份验证方案? 各有什么优缺点?

【问题讨论】:

【参考方案1】:

基于会话的身份验证

在基于会话的身份验证中,服务器将在用户登录后为用户创建一个会话。会话 ID 然后存储在用户浏览器的 cookie 中。当用户保持登录状态时,cookie 将与每个后续请求一起发送。然后服务器可以将cookie中存储的会话ID与内存中存储的会话信息进行比较,以验证用户的身份并发送具有相应状态的响应!

基于令牌的身份验证

许多 Web 应用程序使用 JSON Web Token (JWT) 而不是会话进行身份验证。在基于令牌的应用程序中,服务器使用秘密创建 JWT 并将 JWT 发送到客户端。客户端存储 JWT(通常在本地存储中)并在每个请求的标头中包含 JWT。然后,服务器将使用来自客户端的每个请求验证 JWT 并发送响应。

这里最大的区别是用户的状态不存储在服务器上,因为状态存储在客户端的令牌中。出于可扩展性和移动设备身份验证等原因,大多数现代 Web 应用程序都使用 JWT 进行身份验证。

【讨论】:

以上是关于Django Rest 框架中的基于会话的与令牌身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django Rest 框架进行 JWT 令牌身份验证

django rest 框架身份验证

如何在 django rest 框架中验证 jwt 身份验证中的令牌

Django rest 框架和跨源请求

Django REST 的 JSON Web 令牌不会向用户数据库进行身份验证

Django REST框架令牌认证AngularJS