JWT-based 身份验证究竟应该如何在 Django 中实现(drf 和 simplejwt)?
How exactly should JWT-based authentication be implemented in Django (drf and simplejwt)?
我很难理解 JWT-based 身份验证应该如何在 Django 中实现(我使用的是 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 的全部目的。根据我的理解,我应该将它附加到 headers 以便用户的后续请求包含 headers.
中的令牌
前端将用 ReactJS 编写,与我的 Django 后端位于不同的服务器上 API,两者之间的通信将通过 CORS 配置。
在这种情况下,如何将令牌附加到 headers 并使用户的浏览器在每次请求时发送令牌?是否有某种可能对此有用的软件包?
我认为你把所有东西都搞混了,我会解释一切,但你可能已经知道一些东西了。
JWT简单来说就是一种授权用户的方式,你通常会创建一个endpoint来为用户创建一个token,这个endpoint可以命名为login
, create_token
, 'generate_token',或任何东西!没关系!
然而,如果您使用特定的库,它可能会强制您使用特定的端点,但在 Flask
中,这确实是您喜欢的。
这个 login
(不管你怎么称呼它)端点将获取用户名和密码并检查它是否存在并且正确,然后生成一个 JWT
和一个像 PyJWT 这样的库,您可以将 JWT 配置为在 20 分钟或更长时间后过期,然后您加密 dictionary
(JSON?) 其中 通常 包含 user_id
从数据库中查询。您向用户提供的 JSON 示例:
{
"user_id": something,
"role": something,
...
}
然后加密成一个长字符串
现在,当用户发送请求时,he/she 需要有与请求的 Authorization
header 相同的长字符串。
在postman --> Authorizations
中选择Bearer Authorization
然后插入那个长字符串。
我们也给用户一个refresh_token
.
这是您在 he/she 调用 login
端点时向用户提供的 JSON 示例:
{
token: some_long_string,
refresh_token: some_long_string,
}
那么refresh Token是什么?
只是令牌,当主令牌过期而不是让用户再次输入用户名和密码时,他只是发送我们在他调用时给他的刷新令牌 login
。
还有一点:这是您需要实现的整个流程和逻辑。随心所欲,图书馆或任何你喜欢的东西,并不重要。
我很难理解 JWT-based 身份验证应该如何在 Django 中实现(我使用的是 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 的全部目的。根据我的理解,我应该将它附加到 headers 以便用户的后续请求包含 headers.
中的令牌前端将用 ReactJS 编写,与我的 Django 后端位于不同的服务器上 API,两者之间的通信将通过 CORS 配置。
在这种情况下,如何将令牌附加到 headers 并使用户的浏览器在每次请求时发送令牌?是否有某种可能对此有用的软件包?
我认为你把所有东西都搞混了,我会解释一切,但你可能已经知道一些东西了。
JWT简单来说就是一种授权用户的方式,你通常会创建一个endpoint来为用户创建一个token,这个endpoint可以命名为login
, create_token
, 'generate_token',或任何东西!没关系!
然而,如果您使用特定的库,它可能会强制您使用特定的端点,但在 Flask
中,这确实是您喜欢的。
这个 login
(不管你怎么称呼它)端点将获取用户名和密码并检查它是否存在并且正确,然后生成一个 JWT
和一个像 PyJWT 这样的库,您可以将 JWT 配置为在 20 分钟或更长时间后过期,然后您加密 dictionary
(JSON?) 其中 通常 包含 user_id
从数据库中查询。您向用户提供的 JSON 示例:
{
"user_id": something,
"role": something,
...
}
然后加密成一个长字符串
现在,当用户发送请求时,he/she 需要有与请求的 Authorization
header 相同的长字符串。
在postman --> Authorizations
中选择Bearer Authorization
然后插入那个长字符串。
我们也给用户一个refresh_token
.
这是您在 he/she 调用 login
端点时向用户提供的 JSON 示例:
{
token: some_long_string,
refresh_token: some_long_string,
}
那么refresh Token是什么?
只是令牌,当主令牌过期而不是让用户再次输入用户名和密码时,他只是发送我们在他调用时给他的刷新令牌 login
。
还有一点:这是您需要实现的整个流程和逻辑。随心所欲,图书馆或任何你喜欢的东西,并不重要。