使用Django REST Framework和JSON Web令牌进行用户身份验证

在过去的几个月中,我一直在利用业余时间来构建Web应用程序。虽然我想保留我的应用程序的详细信息(暂时),但我确实想分享我在使用该应用程序时克服的一些困难。特别是在使用JSON Web令牌(JWT)进行用户管理和身份验证时。
科技栈
在深入研究代码之前,我想提供一些有关将要使用的技术的背景信息。在后端,我选择了Django和Django Rest Framework来开发RESTful API,这将是我应用程序的核心。在前端,我决定使用Reactjs来构建我的SPA来调用后端。我将使用Docker进行容器化,使用CircleCI构建我的CI / CD管道,并使用AWS作为基础设施服务。最后,我将使用Postman运行测试并监视API。本演练进展非常迅速,并假定您对Python,Django和Docker有所了解。
要求
开始之前,您应该安装以下python依赖项:

由于我使用的是Docker,因此可以启动并运行以下Dockerfile:

我仍在努力缩小此图片的文件大小(如果您有解决方案可以缩小此图片,请在评论中告知我)。 同时,这就足够了。 继续!
创建用户模型
Django用户模型非常简单。 我们将从AbstractBaseUser和PermissionsMixin类继承来创建模型。

如您所见,令牌是使用@property装饰器动态创建的,有效期为60天。 创建新用户时将调用的UserManager如下:

刚才有很多代码被遗弃了,但是我的目标是让您尽快起步并运行。 我建议逐行阅读代码,以确保您了解发生了什么(从Internet复制代码时,这通常是个好主意!)。 在Django中创建一个自定义用户只需要User类和UserManager! 只是不要忘记通过在settings.py文件中声明您的应用程序来让Django知道这些模型存在:

认证后端
默认情况下,Django不知道如何验证您的JWT。 要解决此问题,我们必须创建以下backends.py文件:

同样,这是很多代码,但是如果您对Python和Django有一定的经验,我想认为这很简单。
我们还必须记得更新我们的settings.py文件,以告诉Django在哪里可以找到我们的自定义身份验证后端:

至此,您已经创建了一个自定义的User模型和UserManager模型,并创建了一个自定义的JWTAuthentication类来对用户令牌进行身份验证。 最后遗漏的是设置用户视图以供DRF处理。
DRF Serializers
有几个视图需要序列化才能最终启动并运行。 第一个是RegistrationSerializer

该序列化程序将接收用户名,电子邮件和密码,并且如果身份验证成功,将返回用户令牌。 接下来,我们需要一种登录现有用户的方式。我们将为此创建一个LoginSerializer:

DRF视图
登录过程还将返回用户令牌,但前提是已经创建了该用户。 有了这两个序列化器之后,我们可以继续进行我们的view.py文件。 我们只需要包括一个用于注册和登录的视图。

最后一步是设置我们的urls.py文件,以将我们的视图映射到url。

最后
创建了所有这些文件后,我们现在可以使用我们的自定义Django模型注册和登录用户,并使用JSON Web令牌成功验证我们的用户。 尽管大多数信息已转储到此页面上,但我希望它对那些希望进行类似操作的人有所帮助。 继续骇客,朋友们!

原文:https://medium.com/@sebastianojeda/user-authentication-with-django-rest-framework-and-json-web-tokens-747ea4d84b9f