如何在 Django(drf 和 simplejwt)中实现基于 JWT 的身份验证?

时间:2021-02-03 06:28:37

标签: python django authentication jwt django-rest-framework-simplejwt

我正在努力理解如何在 Django 中实现基于 JWT 的身份验证(我使用的是 simplejwt)。我只是一个初学者,所以请为一些愚蠢的问题做好准备。 rest-framework-simplejwt 文档非常少,并没有为像我这样的新手提供足够的细节。

path('token/obtain', jwt_views.TokenObtainPairView.as_view(), name='token_create'),
path('token/refresh', jwt_views.TokenRefreshView.as_view(), name='token_refresh'),

所以,我按照官方文档的建议在我的 urls.py 中创建了路径。我从这里去哪里?我想我的困惑来自这样一个事实,即我不确定我必须在代码中的哪个位置发布我的令牌。比方说,我正在登录用户。那么,为了获取令牌,我是否必须从我的视图内部向“token_create”端点发送请求?或者我是否必须以某种方式在我的序列化程序之一中指出它? “refresh_token”端点呢?是否有我需要使用的特定方法?

那么,一旦发行了令牌,我该怎么办?显然,我不应该将它保存在数据库中,因为它首先违背了使用 JWT 的全部目的。根据我的理解,我应该将其附加到标头中,以便用户的后续请求在标头中包含令牌。

前端将使用 ReactJS 编写,并将位于与我的 Django 后端 API 不同的服务器上,两者之间的通信将通过 CORS 进行配置。

在这种情况下,如何将令牌附加到标头并使其能够让用户的浏览器随每个请求发送令牌?是否有某种包可能对此有用?

1 个答案:

答案 0 :(得分:1)

我认为你只是混淆了一切,我会解释一切,但你可能已经知道一些东西。

JWT 只是一种授权用户的方式,你通常会创建一个端点来为用户创建令牌,这个端点可以命名为 logincreate_token、'generate_token' 或任何东西!真的无所谓!

但是,如果您使用特定的库,可能会强制您使用特定的端点,但在 Flask 中,这确实是您喜欢的。

这个 login(不管你怎么称呼它)端点将接受一个用户名和密码并检查它是否存在并且它是正确的,然后生成一个 JWT 和一个像 PyJWT 这样的库,你可以将 JWT 配置为在例如 20 分钟或更长时间内过期,然后您加密一个 dictionary(JSON?),其中 通常 包含您从数据库查询的 user_id。您提供给用户的 JSON 示例:

{
  "user_id": something,
  "role": something,
  ...
}

然后它会被加密成一个长字符串。

现在,当用户发送请求时,他/她需要将该长字符串作为请求的 Authorization 标头。

postman --> Authorizations 中,选择 Bearer Authorization,然后插入该长字符串。

我们还给用户一个refresh_token

这是您在用户调用 login 端点时提供给用户的 JSON 示例:

{
 token: some_long_string,
 refresh_token: some_long_string,

}

那么什么是刷新令牌?

这只是一个令牌,当主令牌过期而不是让用户再次输入用户名和密码时,他只是发送我们在调用 login 时给他的刷新令牌。

还有一点:这是您需要实现的整个流程和逻辑。随心所欲,图书馆或任何您喜欢的东西都无所谓。

相关问题