- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章DRF使用simple JWT身份验证的实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在django的前后端分离项目中drf(django restframe work)框架无疑是首选,关于token验证一般使用的是jwt,但是jwt只支持到django1.x的版本.
官方推荐django2.x之后的版本使用simple jwt,官方文档.
user 模型类:
我user模型类继承的是django.contrib.auth.models.abstractuser,这样可以使用django自带的认证.
如果继承该类,我们就必须在settings中配置 auth_user_model = "users.userprofile" 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
from
datetime
import
datetime
from
django.db
import
models
from
django.contrib.auth.models
import
abstractuser
# create your models here.
class
userprofile(abstractuser):
"""
用户
"""
name
=
models.charfield(max_length
=
30
, null
=
true, blank
=
true, verbose_name
=
"姓名"
)
birthday
=
models.datefield(null
=
true, blank
=
true, verbose_name
=
"出生年月"
)
gender
=
models.charfield(max_length
=
6
, choices
=
((
"male"
, u
"男"
), (
"female"
,
"女"
)), default
=
"female"
, verbose_name
=
"性别"
)
mobile
=
models.charfield(null
=
true, blank
=
true, max_length
=
11
, verbose_name
=
"电话"
)
email
=
models.charfield(max_length
=
100
, null
=
true, blank
=
true, verbose_name
=
"邮箱"
)
class
meta:
verbose_name
=
"用户"
verbose_name_plural
=
"用户"
def
__str__(
self
):
return
self
.username
|
序列化文件:
注意这里使用的user是django管理的user模型类,要从django.contrib.auth.get_user_model实例化获取.
在users模块的serializers.py文件中写如下序列化类继承自rest_framework_simplejwt.serializers.tokenobtainpairserializer:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
from
django.contrib.auth
import
get_user_model
user
=
get_user_model()
class
mytokenobtainpairserializer(tokenobtainpairserializer):
@classmethod
def
get_token(
cls
, user):
token
=
super
().get_token(user)
token[
'name'
]
=
user.username
return
token
def
validate(
self
, attrs):
"""
登录返回token和refresh
:param attrs:
:return:
"""
data
=
super
().validate(attrs)
data[
'token'
]
=
str
(data[
"access"
])
return
data
|
根据官方文档的说明,get_token方法之所以设置token['name']是因为程序可能运行在集群上,这里不写也可以.
编写视图类:
1
2
3
4
|
from
users.serializers
import
mytokenobtainpairserializer
class
mytokenobtainpairview(tokenobtainpairview):
serializer_class
=
mytokenobtainpairserializer
|
编写url
其中api/token/和api/token/refresh/两个url是simple jwt自带的token方法:
api/token/
用于获取tokenapi/token/refresh/
用于刷新token
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from
django.conf.urls
import
url
from
django.urls
import
include, path
from
rest_framework_simplejwt.views
import
(
tokenobtainpairview,
tokenrefreshview,
)
urlpatterns
=
[
# simple jwt 认证接口
path(
'api/token/'
, tokenobtainpairview.as_view(), name
=
'token_obtain_pair'
),
path(
'api/token/refresh/'
, tokenrefreshview.as_view(), name
=
'token_refresh'
),
path(
'login/'
, mytokenobtainpairview.as_view(), name
=
'token_obtain_pair'
),
]
|
settings配置simple_jwt:
这是对token的一些自定义设置包括获取的token和refresh的生命周期等配置,通过查看rest_framework_simplejwt的源码可以发现有很多自定义配置,感兴趣的小伙伴可以通过查看官方文档了解更多,这里我只配置了获取的token的生命周期.
启动程序访问:
可以发现返回了三个值:
api/token/refresh
url,参数就是refresh的值。
1
2
3
4
5
6
7
8
9
|
def
validate(
self
, attrs):
"""
登录返回token和refresh
:param attrs:
:return:
"""
data
=
super
().validate(attrs)
data[
'token'
]
=
str
(data[
"access"
])
return
data
|
视图类:
from rest_framework_simplejwt.tokens import refreshtoken
create
方法,需要通过前边导入的refreshtoken
来获取token
返回给前端。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
from
django.contrib.auth
import
get_user_model
from
django.db.models
import
q
from
rest_framework.response
import
response
from
rest_framework_simplejwt.tokens
import
refreshtoken
from
rest_framework.mixins
import
createmodelmixin
from
rest_framework
import
viewsets
from
rest_framework
import
status
from
users.serializers
import
(
userregserializer
)
from
.models
import
verifycode
user
=
get_user_model()
class
userviewset(createmodelmixin, viewsets.genericviewset):
"""
用户
"""
serializer_class
=
userregserializer
queryset
=
user.objects.
all
()
def
create(
self
, request,
*
args,
*
*
kwargs):
serializer
=
self
.get_serializer(data
=
request.data)
serializer.is_valid(raise_exception
=
true)
user
=
self
.perform_create(serializer)
ret_dict
=
serializer.data
refresh
=
refreshtoken.for_user(user)
access_token
=
str
(refresh.access_token)
ret_dict[
"token"
]
=
access_token
headers
=
self
.get_success_headers(serializer.data)
return
response(ret_dict, status
=
status.http_201_created, headers
=
headers)
def
perform_create(
self
, serializer):
return
serializer.save()
|
到此这篇关于drf使用simple jwt身份验证的实现的文章就介绍到这了,更多相关drf使用simple jwt身份验证内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/qq_42586468/article/details/112524452 。
最后此篇关于DRF使用simple JWT身份验证的实现的文章就讲到这里了,如果你想了解更多关于DRF使用simple JWT身份验证的实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用SQL Server 2008 R2,并且想创建一个触发器。 对于每个添加(仅添加),将像这样更新一列: ABC-CurrentYear-AutoIncrementCode 例子: ABC-
是否可以在显示最终一致性的数据存储中创建/存储用户帐户? 似乎不可能在没有一堆架构复杂性的情况下管理帐户创建,以避免可能发生具有相同 UID(例如电子邮件地址)的两个帐户的情况? 最终一致性存储的用户
您好, 我有一个带有 Identity 的 .NetCore MVC APP并使用 this指导我能够创建自定义用户验证器。 public class UserDomainValidator : IU
这与以下问题相同:HiLo or identity? 我们以本站的数据库为例。 假设该站点具有以下表格: 帖子。 投票。 注释。 使用它的最佳策略是什么: 身份 - 这是更常见的。 或者 HiLo -
我想将 Blazor Server 与 ASP.NET Identity 一起使用。但我需要使用 PostgreSQL 作为用户/角色存储,因为它在 AWS 中。 它不使用 EF,这是我需要的。 我创
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我使用 ASP.NET 身份和 ClaimsIdentity 来验证我的用户。当用户通过身份验证时,属性 User.Identity 包含一个 ClaimsIdentity 实例。 但是,在登录请求期
所以我在两台机器上都安装了 CYGWIN。 如果我这样做,它会起作用: ssh -i desktop_rsa root@remoteserver 这需要我输入密码 ssh root@remoteser
我尝试在 mac osx 上的终端中通过 telnet 连接到 TOR 并请求新身份,但它不起作用,我总是收到此错误消息: Trying 127.0.0.1... telnet: connect to
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我正在开发一项服务,客户可以在其中注册他们的 webhook URL,我将发送有关已注册 URL 的更新。为了安全起见,我想让客户端(接收方)识别是我(服务器)向他们发送请求。 Facebook和 G
在 Haskell 中,有没有办法测试两个 IORef 是否相同?我正在寻找这样的东西: IORef a -> IORef a -> IO Bool 例如,如果您想可视化由 IORef 组成的图形,这
我是 .NET、MVC 和身份框架的新手。我注意到身份框架允许通过注释保护单个 Controller 操作。 [Authorize] public ActionResult Edit(int? Id)
我有一列具有身份的列,其计数为19546542,我想在删除所有数据后将其重置。我需要类似ms sql中的'dbcc checkident'这样的内容,但在Oracle中 最佳答案 在Oracle 12
这是我用来创建 session 以发送电子邮件的代码: props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enabl
我想了解 [AllowAnonymous] 标签的工作原理。 我有以下方法 [HttpGet] public ActionResult Add() { return View(); } 当我没
在使用沙盒测试环境时,PayPal 身份 token 对某些人显示而不对其他人显示的原因是否有任何原因。 我在英国使用 API,终生无法生成或找到 token 。 我已经遵循协议(protocol)并
我对非常简单的事情有一些疑问:IDENTITY。我尝试在 phpMyAdmin 中创建表: CREATE TABLE IF NOT EXISTS typEventu ( typEventu
习语 #1 和 #5 是 FinnAPL Idiom Library两者具有相同的名称:“Progressive index of (without replacement)”: ((⍴X)⍴⍋⍋X⍳
当我第一次在 TFS 中设置时,我的公司拼错了我的用户名。此后他们将其更改为正确的拼写,但该更改显然未反射(reflect)在 TFS 中。当我尝试 checkin 更改时,出现此错误: 有没有一种方
我是一名优秀的程序员,十分优秀!